ringa_lee
不知道你有没有用过js中的call或者apply, 有点类似.
js
call
apply
其实就是把闭包当成对象的成员方法或者静态成员方法.
Closure::bind($cl1, null, 'A'); //就相当于在类里面加了个静态成员方法 Closure::bind($cl2, new A(), 'A'); //相当于在类里面加了个成员方法
成员方法中使用$this访问对象, 静态成员方法直接使用类名::成员的方法.但是因为是匿名函数, 没有函数名, 所以返回一个已经绑定$this对象和类作用域的闭包给你使用.
$this
类名::成员
<?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
不知道你有没有用过
js
中的call
或者apply
, 有点类似.其实就是把闭包当成对象的成员方法或者静态成员方法.
成员方法中使用
$this
访问对象, 静态成员方法直接使用类名::成员
的方法.但是因为是匿名函数, 没有函数名, 所以返回一个已经绑定$this对象和类作用域的闭包给你使用.