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)

Try it

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);Code language: PHP (php)

Try it

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:

<?php

class BankAccount
{
    public float $balance;
}

$account = new BankAccount();
$account->balance = 0;

print($account->balance); // 0Code language: PHP (php)

Try it

For properties with scalar types, you can initialize them in the declaration. For example:

<?php

class BankAccount
{
    public float $balance = 0;
}

$account = new BankAccount();
print($account->balance); // 0Code language: PHP (php)

Try it

Alternatively, you can initialize the typed properties in the constructor of the class:

<?php

class BankAccount
{
    public float $balance = 0;

    public function __construct(float $balance)
    {
        $this->balance = $balance;
    }
}

$account = new BankAccount(100);
print($account->balance); // 100Code language: PHP (php)

Try it

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:

<?php

class BankAccount
{
    public float $balance = 0;

    public function __construct(float $balance)
    {
        $this->balance = $balance;
    }
}

$account = new BankAccount(0);
echo $account->balance; // 0

unset($account->balance);
echo $account->balance; // errorCode 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:

<?php

class BankAccount
{
    public float $balance = 0;

    public function __construct(float $balance)
    {
        $this->balance = $balance;
    }
}

$account = new BankAccount("100.5");
echo $account->balance; // 100.5Code language: PHP (php)

Try it

If you don’t want this behavior, you can disable it by declaring strict_types at the beginning of the file as follows:

<?php

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, and public) and types (except void and callable).
  • Typed properties have uninitialized states, not null like untyped properties.
Did you find this tutorial useful?