42
<?php

namespace Sandbox;

class Sandbox {

    private Connectors\ISandboxConnector $connection;

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

}

?>

对于上面的代码,我收到以下错误:

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

当我删除类型提示和var_dump$connection 变量时,它将是private Sandbox\Sandbox而不是Sandbox\Connectors\ISandboxconnector,为什么?

4

2 回答 2

60

PHP 7.3 及更低版本不支持类型化属性。您只能定义如下变量:

class Sandbox {
    private $connection;

但是,为了帮助编辑器理解您的代码,您可以使用@var标签来记录属性的预期类型:

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

更新

PHP 7.4.0

感谢@Manuel 提到新的更新,PHP 7.4 现在根据PHP RFC:Typed Properties 2.0引入了类型化属性。

属性类型声明支持 PHP 支持的所有类型声明,除了voidcallable。还支持任何类或接口名称、stdClass、标量和复合类型、对父对象和自有对象的引用。

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

注意:注意诸如未初始化状态和继承严格规则等副作用。

于 2013-09-23T10:10:02.603 回答
2

从 PHP 7.4 开始,您可以在类属性上键入提示,如下所示。因此,例如,您的$connection财产将如下所示:

class Sandbox {
    private Connectors\ISandboxConnector $connection;
}
于 2020-01-22T11:00:29.220 回答