我正在尝试在不重写整个事情的情况下扩展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
方法。