玩了一段时间后,您似乎可以将 hello 函数设置为受保护而不是私有。
您的代码有几个小问题。看评论。
class A {
public function __call($name, $params) {
if (method_exists($this, "{$name}")) {
$this->before();
$result = call_user_func_array([$this, "{$name}"], $params);
$this->after();
return $result;
}
}
private function before() {
echo "before\n";
}
private function after() {
echo "after\n";
}
}
class B extends A {
protected function hello() {
echo "Hello\n";
}
}
$b = new B();
$b->hello();
当我运行它时,这是我得到的结果。
before
Hello
after
我在 PHP 7.0.8 上运行它。
简短回答:父类中的公共方法不能调用子类中的私有方法。
您也可以使用特征。
trait Wrappable
{
public function __call($name, $params) {
if (method_exists($this, $name)) {
$this->before();
$result = call_user_func_array([$this, $name], $params);
$this->after();
return $result;
}
}
private function before() {
echo "before\n";
}
private function after() {
echo "after\n";
}
}
class A {
use Wrappable;
public function pub()
{
echo __METHOD__ . "\n";
}
}
class B {
use Wrappable;
protected function hello() {
echo "Hello\n";
}
protected function protHello()
{
echo __METHOD__ . "\n";
$this->privHello();
}
protected function visibilityBridge($f, $a)
{
}
private function privHello()
{
echo __METHOD__ . "\n";
}
}
$a = new A();
$a->pub();
$b = new B();
$b->privHello();