繁体   English   中英

如何从 PHP 中的静态方法中看到类的受保护属性?

[英]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 的输出! 现在,以主的名义,这怎么可能发生?

在 PHP 5.3 中,添加了一个称为后期静态绑定的新功能——这可以帮助我们获得在这种情况下可能更可取的多态行为。 简单来说,后期静态绑定意味着对继承的静态函数的调用将在运行时“绑定”到调用类。 所以,如果我们使用后期静态绑定,这意味着当我们调用“test::oo();”时,测试类中的oo()函数将被调用。然后你返回$instance->一种; static 关键字允许函数在运行时绑定到调用类。所以如果你使用 static 那么你使用的任何访问修饰符(private,public,protected)都意味着更少......

请阅读此链接另一个

发生这种情况是因为您通过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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM