遗憾的是,您的比较不正确。
// 等效于
$cl1 = Closure::fromCallable("getName");
$cl1 = $cl1->bindTo($bob, 'A');
// 很可能就是这样
$cl2 = function() {
return call_user_func_array("getName", func_get_args());
};
$cl2 = $cl2->bindTo($bob, 'A');
执行任一闭包都应该导致与您已发布相同的访问冲突错误。
----
一个简单的 PHP 7.0 填充程序可能看起来像这样
----
namespace YourPackage;
/**
* Class Closure
*
* @see \Closure
*/
class Closure
{
/**
* @see \Closure::fromCallable()
* @param callable $callable
* @return \Closure
*/
public static function fromCallable(callable $callable)
{
// 如果我们有 native 版本,就使用 native 版本!
if(method_exists(\Closure::class, 'fromCallable')) {
return \Closure::fromCallable($callable);
}
return function () use ($callable) {
return call_user_func_array($callable, func_get_args());
};
}
}