类变量中的类型提示

Posted

技术标签:

【中文标题】类变量中的类型提示【英文标题】:Type hinting in class variables 【发布时间】:2013-09-28 04:36:47 【问题描述】:
<?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,为什么?

【问题讨论】:

这里似乎是两个独立的问题。不,该属性的类型提示无效;您不能键入提示属性。打折这部分问题,你能澄清并更好地展示另一部分吗? 我不确定我建议的其他部分是什么?知道你不能输入提示属性是我所需要知道的。(如果你把它作为一个答案,我会接受它) “当我删除类型提示和 var_dump 那个 $connection 变量时,它将是私有 Sandbox\Sandbox 而不是 Sandbox\Connectors\ISandboxconnector,为什么?” ← 那部分. 啊,是的,但现在我知道它忽略了我想要的类型,它回退到它的类。所以这是有道理的。 【参考方案1】:

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;

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

【讨论】:

在 Netbeans 中工作。 在 PhpStorm 中工作。 我刚刚发表了一篇关于所有可用类型提示类型与 PHP 版本的文章:mlocati.github.io/articles/php-type-hinting.html 他们应该为变量添加类型提示。他们有它作为函数参数,所以为什么要停在那里。【参考方案2】:

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

class Sandbox 
    private Connectors\ISandboxConnector $connection;

【讨论】:

以上是关于类变量中的类型提示的主要内容,如果未能解决你的问题,请参考以下文章

ATM java

使用代理类解决静态变量的一个问题

JAVA中的成员变量不赋值默认是0吗?

匿名内部类不能访问外部类方法中的局部变量,除非变量被声明为final类型

在 TypeScript 中为具有类型变量的抽象类中的派生类分配泛型类型

Swift无法使用类型(实例)访问类中的静态变量