如何在 PHP 中的静态方法中查看类的受保护属性


How can protected property of a class be visible from a static method in PHP?

我理解OOP。到目前为止,我的理解是,私有和受保护不能使用 $this->blah 表示法从类外部引用。如果这是正确的,下面的代码如何工作?

<?php
 class test {
   protected $a = "b";
   public static function oo(){
     $instance = new static();
     echo $instance->a;
   }
 }
 test::oo();

给我一个 b 的输出!现在,奉主的名怎么会这样呢?

在 PHP 5.3 中,添加了一个名为 late static bindings 的新功能 – 这可以帮助我们获得在这种情况下可能更可取的多态行为。用最简单的术语来说,后期静态绑定意味着对继承的静态函数的调用将在运行时"绑定"到调用类。因此,如果我们使用后期静态绑定,则意味着当我们调用"test::oo();"时,将调用测试类中的oo()函数>$instance。static 关键字允许函数绑定到调用类,runtime.so 如果您使用 Static,那么无论您使用什么访问修饰符(private、public、protected),它都意味着更少......

请阅读此链接,另一个

发生这种情况是因为您通过echo"呈现它"。例如,您不能像这样引用它:

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.

它将为您提供如下所示的错误消息:

致命错误:无法访问私有财产测试::$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)

你会得到"私人 acess 等等"错误。

你理解错了这句话。 "private and protected cannot be referenced from outside the class"意味着如上例所示,您不能访问类外部的变量,但是在您的示例中,您是从类内部访问它,这意味着它们将按照您的要求执行(echo像您一样输出)

到目前为止,我的理解是私有和受保护不能从类外部引用

如下所述,由于oo的定义与 a 的类型相同,因此oo可以访问a

这实际上是一个非常好的问题,不应该被否决。

据我了解,您可以从同一类的静态方法中访问受保护/私有属性的原因是"在此类中已经知道实现特定的详细信息"。我从可见性官方页面上记录的内容中稍微改写了一下:

相同类型的对象将可以访问彼此的私有成员和受保护成员,即使它们不是相同的实例。这是因为在这些对象内部时,已经知道实现特定的详细信息。

这是有道理的。可见性访问旨在仅公开公众安全使用的内容。但是,如果您已经可以访问正在使用的类的代码,那么就没有必要阻止您使用已经看到的内容。希望这是有道理的..