PHP 8.2: Allow null
and false
as standalone types
PHP 8.0 added support for Union Types, which made it possible to declare a type as a union of two or more types. It allowed false
and null
as possible types for a Union Type, but disallowed their use as standalone types.
Prior to PHP 8.2, it was only possible to use null
and false
as parts of Union Types:
function foo(): string|null {}
function strpos(): int|false {}
Attempting to use null
or false
types as standalone types (i.e without being part of a union type) resulted in a compile-time fatal error in PHP versions PHP 8.0 and PHP 8.1:
function foo(): null {}
function bar(): false {}
Fatal error: Null can not be used as a standalone type in ... on line ...
Fatal error: False can not be used as a standalone type in ... on line ...
In PHP 8.2 and later, using null
and false
as standalone types is allowed. The snippet that resulted in fatal errors above no longer throws any errors in PHP 8.2 and later. This makes PHP's type system more expressive and complete to be able to precisely declare the return, parameter, and property types.
Further, PHP 8.2 and later allow using Union Types with null|false
, which resulted in an error in older PHP versions.
PHP functions and methods that had to use PHPDoc comments to provide accurate type information can directly declare the type in the function itself:
class AnonUser extends User {
- /**
- * @return false
- */
- public function isAdmin(): bool {
+ public function isAdmin(): false {
return false;
}
}
Distinction between void
and null
return types
Note that functions declared with a null
return type must explicitly return null
, or the function call results in a TypeError
exception. Functions that do not explicitly return a value, either by having no return
statement at all, or by omitting the return value (return;
) may continue to use the void
type as a return type.
The following example throws a TypeError
exception because it should have been declared with a void
type instead of a null
return type.
function foo(): null {}
foo();
TypeError: foo(): Return value must be of type null, none returned in ...:...
Unless null
is a return type, declaring the function with a void
or never
return type is the more appropriate approach.
Nullability in null
type
If a type is declared null
, it cannot be marked "nullable" with the ?null
syntax, as it results in a redundant type declaration. PHP throws an error on compile-time if it encounters one:
function doNotMakeSense(): ?null {}
Fatal error: null cannot be marked as nullable in ... on line ...
Related Changes
- PHP 8.0: Union Types
- PHP 8.0: Internal function warnings now throw
TypeError
andValueError
exceptions - PHP 8.1: Intersection Types
- PHP 8.1:
never
type - PHP 8.2:
true
type
Backwards Compatibility Impact
Prior to PHP 8.2, it was not allowed to use null
and false
as standalone types. PHP 8.2 and later allows them as standalone types, and this should not cause any compatibility issues in older PHP versions.
It is not possible to back-port this functionality to older PHP versions.