扩展另一个PHP类的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
<?
$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;
}
}