<?php
class Foo
{
public function getPrivateMethod()
{
return [$this, 'privateMethod'];
}
private function privateMethod()
{
echo __METHOD__, "\n";
}
}
$foo = new Foo();
$privateMethod = $foo->getPrivateMethod();
$privateMethod();
// Fatal error: Call to private method Foo::privateMethod() from global scope
// Причина фатальной ошибки в том, что вызов выполнили за пределами класса Foo,
// и с этого момента будет проверяться видимость.
class Foo1
{
public function getPrivateMethod()
{
// Callable-выражение унаследует область видимости переменных,
// в которой получат выражение
return $this->privateMethod(...); // Значение возврата идентично значению вызова
// Closure::fromCallable([$this, 'privateMethod']);
}
private function privateMethod()
{
echo __METHOD__, "\n";
}
}
$foo1 = new Foo1();
$privateMethod = $foo1->getPrivateMethod();
$privateMethod(); // Foo1::privateMethod
?>