繁体   English   中英

如果子类继承了受保护的方法,为什么我不能从私有方法访问受保护的方法?

[英]why can't I access a protected method from a private method if the protected ones are inherited by the subclasses?

我不明白这个特殊情况或亚历山大所说的话。

class实例和class不一样?

正如 Alexander Larikov 所说,您不能从class 实例访问受保护的方法,但不仅是受保护的方法,而且您也不能从 class 实例访问私有方法。 要从子类的实例访问父 class 的受保护方法,您在子类中声明一个公共方法,然后从子类的公共方法调用父 class 的受保护方法,即

亚历山大的解决方案:

class testgiver{
    protected function dbConnect($userconnecttype)
    {
        echo "dbConnect called with the argument ".$userconnecttype ."!";
    }
}

class testprinter extends testgiver
{
    // WHAAAAAT? WHYYYYY?
    public function buildquestionarray() // public instead of private so you can call it from the class instance
    {
        $this->dbConnect('read');
   }
}

$tp=new testprinter();
$tp->buildquestionarray(); // output: dbConnect called with the argument read!

“对私有方法的致命错误调用”但方法受到保护

如果子类继承了受保护的方法,为什么我不能从私有方法访问受保护的方法

解决方案前的代码:

以下代码中 testprinter 的第 726 行:

private function buildquestionarray()
{
  $query = "etc etc";
  **$conn = $this->dbConnect('read');
  $result = $conn->query($query);
  ...

Testprinter 扩展了 testgiver。 这是 class 的分机:

require_once('testgiver.php');

class testprinter extends testgiver
{...

以及 testgiver 中方法的声明:

protected function dbConnect($userconnecttype)
{...

他们并没有在其他答案中真正解释清楚。

属性和方法(我将统称为“名称”)的可见性由尝试访问该名称的代码的运行位置控制。 它可以在顶级代码、常规 function 或 class 方法中。 如果它在方法中,重要的是定义方法的 class。

不是基于访问该名称的实例的 class。

  • 如果名称声明为private ,则只能在声明名称的 class 的方法中使用该名称。
  • 如果名称被声明为protected ,您可以在该 class 的方法中引用它,也可以在父或后代 class 的方法中引用它。
  • 如果名称被声明为public (默认,如果属性是动态添加的,这也适用),您可以从任何地方引用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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