PHP Typed Properties
Summary: in this tutorial, you wil learn how to define typed properties by adding type hints to class properties.
Introduction to the PHP typed properties
The following example defines the BankAccount class with a property called $balance:
class BankAccount
{
public $balance;
}Code language: PHP (php)
The default value of the $balance property is null.
$account = new BankAccount();
var_dump($account->balance); // nullCode language: PHP (php)
PHP 7.4 allows you to type hints the class properties with any types except void and callable. For example:
class BankAccount
{
public float $balance;
}Code language: PHP (php)
In this example, the $balance property has the type float. When you add the float type to $balance property, the following code causes an error:
$account = new BankAccount();
var_dump($account->balance); // nullCode language: PHP (php)
Error:
Fatal error: Uncaught Error: Typed property BankAccount::$balance must not be accessed before initializationCode language: plaintext (plaintext)
It doesn’t work because the $balance property now becomes uninitialized. The default value of the $balance property is not null like before. Notice that you can still create a new object with typed properties uninitialized.
To read from a typed property, you need to initialize it first. For example:
class BankAccount
{
public float $balance;
}
$account = new BankAccount();
$account->balance = 0;
var_dump($account->balance); // 0
Code language: PHP (php)
For properties with scalar types, you can initialize them in the declaration. For example:
class BankAccount
{
public float $balance = 0;
}
$account = new BankAccount();
var_dump($account->balance); // 0
Code language: PHP (php)
Alternatively, you can initialize the typed properties in the constructor of the class:
class BankAccount
{
public float $balance = 0;
public function __construct(float $balance)
{
$this->balance = $balance;
}
}
$account = new BankAccount(100);
var_dump($account->balance); // 100
Code language: PHP (php)
If you unset a typed property, its status will change back to uninitialized. Note that for an untyped property, its value will become null after unset. For example:
class BankAccount
{
public float $balance = 0;
public function __construct(float $balance)
{
$this->balance = $balance;
}
}
$account = new BankAccount(0);
var_dump($account->balance); // 0
unset($account->balance);
var_dump($account->balance); // error
Code language: PHP (php)
Typed properties and strict types
In the following example, the constructor of the BankAccount expects a float. However, you can pass a string. In this case, PHP coerces the string to a float:
class BankAccount
{
public float $balance = 0;
public function __construct(float $balance)
{
$this->balance = $balance;
}
}
$account = new BankAccount("100.5");
var_dump($account->balance); // 100.5
Code language: PHP (php)
If you don’t want this behavior, you can disable it by declaring strict_types at the beginning of the file as follows:
declare(strict_types=1);
class BankAccount
{
public float $balance = 0;
public function __construct(float $balance)
{
$this->balance = $balance;
}
}
$account = new BankAccount("100.25"); // error
var_dump($account->balance);
Code language: PHP (php)
Error:
Fatal error: Uncaught TypeError: Argument 1 passed to BankAccount::__construct() must be of the type float, string given.Code language: plaintext (plaintext)
Summary
- Typed properties include modifiers (
private,protected, andpublic) and types (exceptvoidandcallable). - Typed properties have uninitialized states, not null like untyped properties.