$func = function($say){ echo $this->name, ':', $say, php_eol;};$func('good'); // fatal error: uncaught error: using $this when not in object context
在这个匿名函数中,我们使用了 $this->name 来获取当前作用域下的 $name 属性,可是,这个 $this 是谁呢?我们并没有定义它,所以这里会直接报错。错误信息是:使用了 $this 但是没有对象上下文,也就是说没有指定 $this 引用的作用域。
1.bindto() 方法绑定 $this
$func = $func->bindto($lily, 'lily');// $func = $func->bindto($lily, lily::class);// $func = $func->bindto($lily, $lily);$func1('cool');
这回就可以正常输出了。 bindto() 方法是复制一个当前的闭包对象,然后给它绑定 $this 作用域和类作用域。
$lily 参数是一个 object $newthis 参数,也就是给这个复制出来的匿名函数指定 $this 。
'lily' 则是绑定一个新的 类作用域 ,它代表一个类型、决定在这个匿名函数中能够调用哪些 私有 和 受保护 的方法
如果不给这个参数,那么我们就不能访问这个 private 的 $name 属性了:
$func1 = $func->bindto($lily);$func1('cool2'); // fatal error: uncaught error: cannot access private property lily::$name
2.call() 方法绑定 $this
$func->call($lily, 'well'); // lily:well
推荐:《2021年php面试题大汇总(收藏)》《php视频教程》
以上就是在php中如何为匿名函数指定this的详细内容。