扩展另一个的PHP类如何继承私有函数?

时间:2012-04-09 06:48:30

标签: php class inheritance

我正在尝试扩展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类的情况下修复此问题?

6 个答案:

答案 0 :(得分:14)

,如果不修改foo类,就无法修复此问题。因为继承的类无法访问父类的私有成员。这是一个非常基本的规则。

setSomething()声明为protected。它会被解决。

请参阅manual

答案 1 :(得分:6)

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

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

答案 2 :(得分:6)

bar 继承函数正常,但无法调用它。这就是private方法的重点,只有声明类可以调用它们。

答案 3 :(得分:3)

答案 4 :(得分:0)

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

答案 5 :(得分:0)

你试过这个吗?

class bar extends foo {

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

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