当前位置 博文首页 > 文章内容

    在PHP中如何为匿名函数指定this

    作者:shunshunshun18 栏目:未分类 时间:2021-04-08 10:45:22

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    2021040616324228213.jpg

    关于闭包匿名函数,在JS中有个很典型的问题就是要给它绑定一个 this 作用域。其实这个问题在PHP中也是存在的,比如下面这段代码:

    $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

    推荐:《》《》