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

扩展另一个PHP类的PHP类如何继承私有函数?,php,class,inheritance,oop,Php,Class,Inheritance,Oop,我试图在不重写整个内容的情况下扩展一个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; } privat

我试图在不重写整个内容的情况下扩展一个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;
  }

}
?>

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

私有成员是不可继承的,您不能在子类中使用它们。他们在课外是不可接近的


您必须将该功能设置为受保护或公开。该类和继承的类都可以访问受保护的成员。因此,最好的办法是保护该函数。

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

声明
setSomething()
为受保护的
。这事会解决的


请参见

可以继承函数,但无法调用它。这就是
private
方法的全部要点,只有声明类才能调用它们。

在不修改原始类的情况下,继承类无法直接调用父类的
private
方法。

尝试反射

此外:

你试过这个吗

class bar extends foo {

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

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

您不能将
setSomething()
更改为
protected
?如上所述,foo类不能修改。我还可以怎么做呢?你使用正确的工具来完成这项工作,也就是说,让它受到
保护
。我理解你的观点,但是我没有更改原始类的权限。也许我把这个例子简单化了。原始类来自另一个仅包含在require()中的文件。在这种情况下,作者不希望它在子类中可用。或者在设计阶段没有考虑。这是父类的一个设计规则,正如我前面所说的,foo类是不可修改的。我还能做什么?只要保持OOP就不能这么做。所以C++中的私有继承不是真实的OOP?我不同意。如上所述,foo类是不可修改的。我还能怎么做呢?@KennethVogt:你在这里没有选择。所以我必须在我的bar类中显式地重新定义setSomething()?是的,这是一个明智的方法。更好的方法是在父类中使用protected;)这样它就可以从外面保密,但“儿童”班可以访问它。哇,这让我不敢太花哨了。好消息。
class bar extends foo {

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