首页 > 解决方案 > @property 注释和 PHP 中的受保护变量有什么区别?

问题描述

我有个问题。在 PHP 类开发期间,我在构造函数中设置了这样的类属性:

public function __construct() {
    $this->a = 'ABC';
}

现在我的 IDE 告诉我该属性是动态声明的,我应该将此属性添加到我的类中。现在我有两个选择:

类顶部的变量:

protected string  $a = '';

或者类文档中的注释:

/**
 * Class ABC
 *
 * @property string a
 * 
 * @package Johnny
 */
class ABC {

那么这里有什么区别,我应该使用哪一个?有时我在使用上面的注释时遇到错误,property is not defined因此修复是受保护的或私有的变量。

谢谢你的帮助!

标签: php

解决方案


受保护的属性只能从同一类或子类中的方法访问。声明该属性protected可防止在类外分配或读取它。

在 docblock 中添加@property注释只是让 IDE 知道该属性存在。它将使用它来抑制像你得到的警告,并完成属性名称,就像它对在类定义中显式声明的属性所做的那样。它对 PHP 本身处理属性的方式影响不大;访问控制由属性是否声明为公共、私有或受保护来指定。

您还可以在类定义中创建公共和私有属性。

public string $a;
private string $a;

公共意味着可以从类外部访问该属性(就像您动态创建的属性一样),私有意味着它只能从类本身(而不是子类)访问。

If you don't declare a property explicitly, and create it dynamically using an assignment, it's automatically public. If you want to prevent this, see Is there a way to disable adding properties into a class from an instance of the class?


推荐阅读