为了账号安全,请及时绑定邮箱和手机立即绑定

PHP 中 @property 注释和受保护变量有什么区别?

PHP 中 @property 注释和受保护变量有什么区别?

PHP
慕沐林林 2023-11-04 20:55:52
我有一个问题。在 PHP 类开发过程中,我在构造函数中设置了一个类属性,如下所示:public function __construct() {    $this->a = 'ABC';}现在我的 IDE 告诉我该属性是动态声明的,我应该将此属性添加到我的类中。现在我有两个选择:类顶部的变量:protected string  $a = '';或者类文档中的注释:/** * Class ABC * * @property string a *  * @package Johnny */class ABC {那么这里有什么区别以及我应该使用哪一个呢?有时我在使用上面的注释时会遇到错误,property is not defined因此修复是受保护的或私有的变量。
查看完整描述

2 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

受保护的属性只能从同一类或子类中的方法访问。声明该属性protected可防止在类外部对其进行赋值或读取。

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

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

public string $a;
private string $a;

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

如果您没有显式声明属性,并使用赋值动态创建它,则它会自动成为公共属性。


查看完整回答
反对 回复 2023-11-04
?
当年话下

TA贡献1890条经验 获得超9个赞

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


protected string  $a = '';

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


这是一个文档块:


/**

 * @var string

 */

public $a;

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


/**

 * @var string

 */

public string $a;

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


/**

 * @ORM/Column(type="int")

 * @ORM/Id

 */

protected $id;


查看完整回答
反对 回复 2023-11-04
  • 2 回答
  • 0 关注
  • 138 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信