[英]How can protected property of a class be visible from a static method in PHP?
我了解 OOP。 到目前为止我所理解的是,不能使用 $this->blah 符号从类外部引用 private 和 protected 。 如果这是正确的,以下代码如何工作?
<?php
class test {
protected $a = "b";
public static function oo(){
$instance = new static();
echo $instance->a;
}
}
test::oo();
给我一个 b 的输出! 现在,以主的名义,这怎么可能发生?
发生这种情况是因为您通过echo
'ing it 来“呈现它”。 例如,您不能像这样引用它:
class test {
private $a = 'b';
function __construct() {
echo 'instantiated';
}
}
$test = new test();
echo $test->a; // This line won't work, since it's a private var.
它会给你一条错误消息,如下所示:
致命错误:无法访问私有属性 test::$a
Example (https://eval.in/226435)
正如我之前说的,你从类的内部访问它,这样你就可以查看。 (这就是您在那里的$instance
。)如果您修改代码以使用它,如下所示:
class test {
protected $a = "b";
public static function oo(){
$instance = new static();
return $instance;
}
}
echo test::oo()->a;
Example of the above (https://eval.in/226439)
你会得到“私人访问等等”错误。
你理解错了。 "private and protected cannot be referenced from outside the class"
意味着如上面的示例所示,您不能访问类外部的变量,但是对于您的示例,您是从类内部访问它,这意味着它们会按照你的要求做(像你一样echo
)
到目前为止我的理解是 private 和 protected 不能从类外部引用
如下所示,由于oo
的定义与a
类型相同,因此oo
可以访问a
。
这实际上是一个很好的问题,不应该被否决。
据我了解,您可以从同一个类的静态方法中访问受保护/私有属性的原因是“在这个类中已经知道实现特定的细节”。 我从 Visibility 官方页面上记录的内容中稍微改写了这一点:
相同类型的对象可以访问彼此的私有成员和受保护成员,即使它们不是相同的实例。 这是因为在这些对象内部时,实现特定的细节是已知的。
这是有道理的。 可见性访问旨在仅公开公众可以安全使用的内容。 但是如果您已经可以访问您正在使用的类的代码,那么就没有必要阻止您使用您已经看到的内容。 希望这是有道理的..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.