【问题标题】:Whats the difference between a @property annotation and a protected variable in PHP?@property 注释和 PHP 中的受保护变量有什么区别?
【发布时间】:2020-12-17 16:37:38
【问题描述】:

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

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

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

类顶部的变量:

protected string  $a = '';

或者类文档中的注释:

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

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

感谢您的帮助!

【问题讨论】:

  • 你应该使用第一个。第二个只是评论。
  • @Iwrestledabearonce。不是评论,而是文档块。解析文档块时删除注释不是。
  • @blahy - 文档块实际上就是 cmets。它们只是 IDE 可以解析的特殊格式的 cmets。
  • 不,那不是真的
  • @blahy - “DocBlock 是一种特殊类型的评论” - 来自Official Docs。您无法通过反射获取评论,但注释实际上只是评论的另一个词。我已经完成了。

标签: php


【解决方案1】:

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

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

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

public string $a;
private string $a;

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

如果您没有显式声明属性,而是使用赋值动态创建它,它会自动公开。如果您想防止这种情况发生,请参阅Is there a way to disable adding properties into a class from an instance of the class?

【讨论】:

  • 在没有声明的情况下这样做$this->a = 'ABC'; 始终会将其创建为 PUBLIC。
【解决方案2】:

这是一个属性类型的显式声明:

protected string  $a = '';

这是内部强制执行的限制。如果您尝试将字符串以外的内容分配给$a,您将收到 TypeError 异常。像这样声明属性类型提示是 7.4 中引入的功能。如果您知道您的环境将是 7.4+,您应该更喜欢这种方法。

这是一个文档块:

/**
 * @var string
 */
public $a;

这是对脚本运行时没有影响的注释。它的存在只是为了让 PHPStorm 或 NetBeans 等 IDE 可以在您的开发环境中提供提示。如果您使用像上面这样的显式类型提示,那么这些 docblock 声明是多余且不需要的。即,没有必要这样做:

/**
 * @var string
 */
public string $a;

请注意,有很多库使用注释文档块来提供特殊的运行时含义。这些库使用反射来动态解析 docblock cmets 并对它们做出反应。换句话说,PHP 本身不受 docblock cmets 的影响,但您的脚本能够查看它们,因此能够基于它们的条件。例如,使用 Doctrine,您可以使用 docblock cmets 来解释您的数据库字段是什么样的:

/**
 * @ORM/Column(type="int")
 * @ORM/Id
 */
protected $id;

【讨论】:

    猜你喜欢
    • 2016-03-08
    • 2023-03-21
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2010-10-27
    • 2012-06-13
    • 2011-05-20
    相关资源
    最近更新 更多