<?php
class Foo {
public function getPrivateMethod() {
return [$this, 'privateMethod'];
}
private function privateMethod() {
echo __METHOD__, "\n";
}
}
$foo = new Foo;
$privateMethod = $foo->getPrivateMethod();
$privateMethod();
// 致命错误:从全局范围调用私有方法 Foo::privateMethod()
// 这是因为调用是在 Foo 之外执行的,并且可见性将从此时检查。
class Foo1 {
public function getPrivateMethod() {
// 使用获取可调用时的作用域。
return $this->privateMethod(...); // 等同于 Closure::fromCallable([$this, 'privateMethod']);
}
private function privateMethod() {
echo __METHOD__, "\n";
}
}
$foo1 = new Foo1;
$privateMethod = $foo1->getPrivateMethod();
$privateMethod(); // Foo1::privateMethod
?>