On 22 March 2024 00:04:27 GMT, Robert Landers <landers.rob...@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]