Re: Proposal: AS assertions
| From: | Rowan Tommins [IMSoP] | Date: | Fri, 22 Mar 2024 07:47:20 +0000 |
| Subject: | Re: Proposal: AS assertions | ||
| References: | 1 2 3 4 5 6 7 8 9 10 11 12 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-122721@lists.php.net to get a copy of this message | ||
On 22 March 2024 00:04:27 GMT, Robert Landers <landers.robert@gmail.com> wrote:
>I think that is where we are getting confused:
null is a value
>(or
>at least, the absence of a value). The fact that the type system
>allows it to be used as though its a type (along with true and false)
>is interesting, but I think it is confusing the conversation.
Every value needs to belong to some type: for instance, true and false belong to the type
"boolean", as returned by the gettype() function. There is a value called null, and the
type it belongs to is also called "null".
Unlike some languages, PHP has no concept of a typed null reference - you can't have "a
null DateTime"; you can only have the one universal null, of type null.
The existence of "null" in type checks is therefore necessary if you want to allow every
value to pass some type check. There isn't any other type that can include the value null
because the type of null is always null.
That's completely different from true and false, both of which are covered by a type check for
"bool". They are special cases, which aren't consistent with anything else in the
type system. The "false" check was added first, as a way to express clearly the common
pattern in old standard library functions of returning false on error. Then "true" was
added later, for consistency. Both are newer, and far more exotic, than "null".
Disallowing true and false in some type checking contexts would be fine (although mostly
they're pointless, rather than harmful). Disallowing or repurposing null would mean you have an
incomplete type system, because there is no other type to match a null value against.
Regards,
Rowan Tommins
[IMSoP]