Type hinting in class variables

Gerben Jacobs picture Gerben Jacobs · Sep 23, 2013 · Viewed 19.5k times · Source
<?php

namespace Sandbox;

class Sandbox {

    private Connectors\ISandboxConnector $connection;

    public function __construct(Connectors\ISandboxConnector $conn) {
        $this->connection = $conn;
    }

}

?>

For the above code I'm getting the following error:

Parse error: syntax error, unexpected 'Connectors' (T_STRING), expecting variable (T_VARIABLE)

When I remove the type hinting and var_dump that $connection variable, it will be private Sandbox\Sandbox and not Sandbox\Connectors\ISandboxconnector, why?

Answer

Vahid Hallaji picture Vahid Hallaji · Sep 23, 2013

PHP 7.3 and below does not support typed properties. You could only define a variable as below:

class Sandbox {
    private $connection;

However, to help editors understand your code, you may use a @var tag to document the expected type of the property:

class Sandbox {
    /** @var Connectors\ISandboxConnector */
    private $connection;

Update

PHP 7.4.0

Thanks @Manuel for mentioning the new update, PHP 7.4 now introduces typed properties according to PHP RFC: Typed Properties 2.0.

Property type declarations support all type declarations supported by PHP, with the exception of void and callable. Any class or interface name, stdClass, scalar and compound types, references to parent and own objects are also supported.

class Sandbox {
    public int $id;
    public string $name;
    private Connectors\ISandboxConnector $connection;
}

Note: keep an eye on side effects such as uninitialised state and inheritance strict rules.