Re: Proposal: AS assertions

From: Date: Wed, 20 Mar 2024 23:05:07 +0000
Subject: Re: Proposal: AS assertions
References: 1 2 3 4 5  Groups: php.internals 
Request: Send a blank email to internals+get-122703@lists.php.net to get a copy of this message
On Wed, Mar 20, 2024 at 8:30 PM Rowan Tommins [IMSoP] <imsop.php@rwec.co.uk> wrote: > > > > On 20 March 2024 12:51:15 GMT, Robert Landers <landers.robert@gmail.com> wrote: > > >Oh and there isn't any difference between: > > > >$x as ?Type > > > >or > > > >$x as Type|null > > > I'm not sure if I've misunderstood your example, or you've misunderstood mine. > > I'm saying that this should be an error, because the value is neither an instance of Foo > nor null: > > $a = 42; > $b = $a as Foo|null; > > Your earlier example implies that would make $b equal null, which feels wrong to me, because it > means it wouldn't match this: > > $a = 42; > $b = $a as Foo|Bar; > > If we want a short-hand for "set to null on error" that should be separate from the > syntax for a nullable type. > > > Regards, > Rowan Tommins > [IMSoP] Interesting. I'm not sure there's a better way to say "set to null on error" since it would be barely sensical to give a nullable type on the right hand side anyway; so we might as well use it. In other words, I can't think of a case where you'd actually want a Type|null and you wouldn't have to check for null anyway. If you think about it, in this proposal, you could use it in a match: // $a is TypeA|TypeB|null match (true) { $a as ?TypeA => 'a', $a as ?TypeB => 'b', $a === null => 'null', } No matter what, you're going to have to check for null if you want to handle all cases and throwing an error when you ask for a nullable type would render a ton of utility moot (i.e., this match statement wouldn't work). It's probably better to say, "I want what is on the right-hand side of as or an error." Including null in that type seems to be that you would get null if no other type matches, since any variable can be null. Robert Landers Software Engineer Utrecht NL

« previous php.internals (#122703) next »