PHP Closure类的bind()和bindTo()怎么用?

发布于 2022-09-04 00:22:43 字数 545 浏览 26 评论 0

看PHP手册关于Closure的bind和bindTo的用法。真心没看懂,不理解其中的概念。
比如Closure::bind ,手册上说“复制一个闭包,绑定指定的$this对象和类作用域”。这该怎么去理解?
闭包和$this是以怎样的形式绑定在一起的?类作用域又是做什么用的?
还有,一个是静态版本,一个是动态版本,这个指的是什么?
能否用给出的示例解释一下这些概念呢?

<?php
class A {
    private static $sfoo = 1;
    private $ifoo = 2;
}
$cl1 = static function() {
    return A::$sfoo;
};
$cl2 = function() {
    return $this->ifoo;
};

$bcl1 = Closure::bind($cl1, null, 'A');
$bcl2 = Closure::bind($cl2, new A(), 'A');
echo $bcl1(), "\n";
echo $bcl2(), "\n";
?>

谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

沉默的熊 2022-09-11 00:22:43

不知道你有没有用过js中的call或者apply, 有点类似.

其实就是把闭包当成对象的成员方法或者静态成员方法.

Closure::bind($cl1, null, 'A'); //就相当于在类里面加了个静态成员方法
Closure::bind($cl2, new A(), 'A'); //相当于在类里面加了个成员方法

成员方法中使用$this访问对象, 静态成员方法直接使用类名::成员的方法.
但是因为是匿名函数, 没有函数名, 所以返回一个已经绑定$this对象和类作用域的闭包给你使用.

坐在坟头思考人生 2022-09-11 00:22:43
<?php

class A
{
    private static $sfoo = 1;
    private $ifoo = 2;
    public static $ps = 3;
}

$aObj = new A();

echo "\n#1\n";
echo A::$ps;    //3
//echo A::$sfoo; //无权限
//echo $aObj->ifoo; //无权限


echo "\n#2\n";
$callable1 = Closure::bind(function () {
    return $this::$sfoo;
}, $aObj, 'A');
echo $callable1();    //1


echo "\n#3\n";
$callable2 = Closure::bind(function () {
    return $this->ifoo;
}, $aObj, 'A');
echo $callable2();      //2


echo "\n#4\n";
$callable3 = Closure::bind(function () {
    return A::$sfoo;        //phpStorm 会报红
}, null, 'A');
echo $callable3();    //1

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文