PHP8 Variable TypesClass/interface name | An instance of the class or interface | self | The same class the type is used in | parent | The parent of the class the type is used in | callable | Something callable | bool | A boolean | int | An integer | float | A float | string | A string | array | An array | iterable | Array or traversable | object | An object | mixed | Any value | Return Types | void | Function will not return anything | static | Function may return static |
New mixed typeMixed means any one of: | | array | bool | callable | | string | int | resource | | float | null | object |
Note that because mixed already contains null , it is not nullable itself.
Return staticclass Foo
{
public function test(): static
{
return new static();
}
}
|
Static is now a valid return type.
The nullsafe operator (copy)$foo = $bar->getBaz()?->asFormatted();
|
Quickly check for nulls in method returns.
Union typespublic function foo(Foo|Bar $input): int|float;
|
You can now specify more than one type in a type hint:
• The void type cannot be part of a union.
• Unions can be nullable by including null as a type or preceding with a question mark.
Named argumentsfunction foo(string $a, int $b, ?string $c = null)
{
...
}
foo(
c: 'value c',
a: 'value a'
);
|
Pass values to functions and methods by name, regardless of the order in which they are defined.
| | Attributesuse App\Attributes\ExampleAttribute;
#[ExampleAttribute]
class Foo
{
#[ExampleAttribute]
public const FOO = 'foo';
#[ExampleAttribute]
public $x;
#[ExampleAttribute]
public function foo(#[ExampleAttribute] $bar) { }
}
|
Match expression$result = match($input) {
0 => "hello",
'1', '2', '3' => "world",
};
|
Switch statements made simple. Note, the comparisons made by match use strict types.
Constructor property promotionclass Money
{
public function __construct(
public Currency $currency,
public int $amount,
) {}
}
|
In the above example Currency and int are both automatically made public properties of the class and assigned values on construction.
Weak mapsclass Foo
{
private WeakMap $cache;
public function getSomethingWithCaching(object $obj): object
{
return $this->cache[$obj]
??= $this->computeSomethingExpensive($obj);
}
}
|
A weak map allows for storage of key-value pairs, but the PHP garbage collection will drop a weak map element where the only reference to it is the weak map itself.
Throw expression$triggerError = fn () => throw new MyError();
$foo = $bar['offset'] ?? throw new CustomEx('offset');
|
Throw is now an expression instead of a statement, making it more flexible.
Non-capturing catchestry {
// Something goes wrong
} catch (MySpecialException) {
Log::error("Something went wrong");
}
|
When you catch exceptions and throwables, you no longer need a variable.
| | ::class on objects$foo = new Foo();
var_dump($foo::class);
|
Works the same as get_class() .
Trailing comma in parameter listspublic function(
string $parameterA,
int $parameterB,
Foo $objectfoo,
) {
// …
}
|
You can now end a parameter list with a comma without an error.
Create DateTime objects from interfacesDateTime::createFromInterface(DateTimeInterface $other);
DateTimeImmutable::createFromInterface(DateTimeInterface $other);
|
New Stringable interfaceclass Foo
{
public function __toString(): string
{
return 'foo';
}
}
function bar(string|Stringable $stringable) { / … / }
bar(new Foo());
bar('abc');
|
New functionsstr_contains('haystack', 'needle')
| Does haystack contain needle? | str_starts_with('haystack', 'needle')
| Does haystack start with needle? | str_ends_with('haystack', 'needle')
| Does haystack end with needle? | fdiv()
| Handles division by zero without an error. | get_debug_type()
| Like gettype() but with more detail | get_resource_id()
| Fetch the numeric ID of a resource |
Breaking ChangesInternal errors and engine warnings have been made consistent and/or reclassified. | The @ operator no longer silences fatal errors. | The default error reporting level is now E_ALL . | The default PDO error mode is no longer silent. | Concatenation precedence has changed - addition now precedes concatenation. | Namespaces can now include reserved names. | ReflectionFunction::isDisabled() , ReflectionParameter::getClass() and ReflectionParameter::isCallable() have been deprecated.
|
There are more breaking and engine changes, this list is limited to those you are most likely to encounter. For a full run-down, check out Brent's article linked below.
|
Created By
https://aloneonahill.com
Metadata
Favourited By
Comments
No comments yet. Add yours below!
Add a Comment
Related Cheat Sheets
More Cheat Sheets by DaveChild