【问题标题】:How can a PHP class that extends another inherit a private function?扩展另一个 PHP 类如何继承私有函数?
【发布时间】:2012-04-21 15:08:28
【问题描述】:

我正在尝试扩展一个 PHP 类而不重写整个事情。这是一个例子:

<?
$a = new foo();
print $a->xxx();
$b = new bar();
print $b->xxx();

class foo {
  const something = 10;

  public function xxx() {
    $this->setSomething();
    return $this->something;
  }

  private function setSomething() {
    $this->something = self::something;
  }
}

class bar extends foo {

  public function xxx() {
    $this->setSomething();
    $this->something++;
    return $this->something;
  }

}
?>

但是,当我运行脚本时,出现以下错误:

Fatal error: Call to private method foo::setSomething() from context 'bar' in test.php on line 23

似乎 bar 没有继承私有函数 setSomething()。在不修改 foo 类的情况下如何解决这个问题?

【问题讨论】:

  • 你不能把setSomething()改成protected吗?
  • 如上所述,foo 类是不可修改的。我还能怎么做?
  • 你使用了正确的工具来完成这项工作,也就是说,将其设为protected
  • 我理解你的意思但是我没有权限改变原来的班级。也许我过于简化了这个例子。原始类来自仅包含在 require() 中的另一个文件。
  • 在这种情况下,作者不希望它在子类中可用。或者在设计阶段没有考虑。所以这是该父类的设计规则。

标签: php class inheritance


【解决方案1】:

,您无法在不修改 foo 类的情况下解决此问题。因为继承的类不能访问父类的私有成员。这是一个非常基本的 规则。

setSomething() 声明为protected。会解决的。

manual

【讨论】:

  • 如上所述,foo 类是不可修改的。我还能怎么做?
  • 只要保持oop就可以了。
  • 那么 C++ 中的私有继承不是真正的 OOP 吗?我不同意。
【解决方案2】:

私有成员不可继承,不能在子类中使用。课堂外无法访问它们。

您必须将该功能设为受保护或公开。该类和继承的类可以访问受保护的成员。所以,最好的办法是使该功能受到保护。

【讨论】:

  • 如上所述,foo 类是不可修改的。我还能怎么做?
  • @KennethVogt:这里没有选择。
【解决方案3】:

bar继承这个函数没问题,但它不能调用它。这就是private 方法的全部意义所在,只有声明类可以调用它们。

【讨论】:

  • 所以我必须在我的 bar 类中明确地重新定义 setSomething()?
  • 是的,这就是 sane 方法。
  • 更好的方法是在父类中使用 protected ;) 这样它就可以从外部保持私有,但是“子”类可以访问它。
【解决方案4】:

【讨论】:

  • 哇,这吓到我不敢太花哨了。不过很好的信息。
【解决方案5】:

你试过了吗?

class bar extends foo {

    public function xxx() {
      $this->something = parent::xxx();
      $this->something++;
      return $this->something;
    }
}

注意 parent::xxx(); 是公开的,所以它应该可以工作......即使它看起来像一个静态调用。

【讨论】:

    【解决方案6】:

    不修改原类,继承的类无法直接调用父类的private方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-28
      • 2011-10-19
      • 2014-11-06
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多