<?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
?>