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


How can a PHP class that extends another inherit a private function?

我正在尝试在不重写整个事情的情况下扩展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 类的情况下解决此问题?

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

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

请参阅手册

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

您必须使该功能成为受保护或公共的。受保护的成员可供该类和继承的类访问。因此,最好的办法是使该功能受保护。

bar继承

函数正常,但它不能调用它。这就是private方法的重点,只有声明类才能调用它们。

尝试反射

http://php.net/manual/en/class.reflectionclass.php

也:

在 PHP 中从类外部调用私有方法和私有属性

你试过这个吗?

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

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

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