我正在尝试扩展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类的情况下修复此问题?
答案 0 :(得分:14)
答案 1 :(得分:6)
私有成员不可继承,您不能在子类中使用它们。课外无法访问它们。
您必须将该功能设为受保护或公开。受保护的成员可以访问该类和继承的类。所以,你最好的选择是使该功能受保护。
答案 2 :(得分:6)
bar
继承函数正常,但无法调用它。这就是private
方法的重点,只有声明类可以调用它们。
答案 3 :(得分:3)
尝试反思
http://php.net/manual/en/class.reflectionclass.php
此外:
Call private methods and private properties from outside a class in PHP
答案 4 :(得分:0)
如果不修改原始类,继承类就无法直接调用父类的private
方法。
答案 5 :(得分:0)
你试过这个吗?
class bar extends foo {
public function xxx() {
$this->something = parent::xxx();
$this->something++;
return $this->something;
}
}
注意 parent :: xxx(); 是公共的,所以它应该可以工作......即使它看起来像静态调用。