PHP Closure类Bind与BindTo方法
2016-05-25 17:31
471 查看
Closure类为闭包类,PHP中闭包都是Closure的实例:
Closure有两个函数将闭包函数绑定到对象上去,
静态方法Bind
动态方法BindTo
静态闭包不能有绑定的对象($
此时Closure不可以使用$this。
静态闭包中不可以调用$this,否则会报错。就像类的静态方法不可以调用$this一样
类作用域:
当闭包绑定到对象上时,或者绑定到null成为静态对象,可以通过返回的闭包对象来调用对象的方法,同时可以设定第三个参数$newscope来设定对象中
属性或方法对于闭包的访问可见性。闭包的访问可见性和$newscope类的成员函数是相同的。
测试:
$newscope默认为‘Static'表示不改变,还是之前的作用域。
http://php.net/manual/zh/class.closure.php
1 $func = function(){}; 2 var_dump($func instanceof Closure); 输出 bool(true)
Closure有两个函数将闭包函数绑定到对象上去,
静态方法Bind
public static Closure Closure::bind ( Closure $closure , object $newthis [, mixed $newscope = 'static' ] )
动态方法BindTo
public Closure Closure::bindTo ( object $newthis [, mixed $newscope = 'static' ] )
静态闭包不能有绑定的对象($
newthis参数的值应该设为
NULL )
此时Closure不可以使用$this。
class Father { public $pu = "public variable"; public static $spu = 'public static'; } class Son extends Father { } class Other { } $son = new Son(); $func = function(){ echo self::$spu; }; ($func -> bindTo(null, 'Son'))();
静态闭包中不可以调用$this,否则会报错。就像类的静态方法不可以调用$this一样
$son = new Son(); $func = function(){ echo $this -> $pu; }; ($func -> bindTo(null, 'Son'))(); 报错: Fatal error: Uncaught Error: Using $this when not in object context in D:\laravel\test.php:21 Stack trace:
类作用域:
当闭包绑定到对象上时,或者绑定到null成为静态对象,可以通过返回的闭包对象来调用对象的方法,同时可以设定第三个参数$newscope来设定对象中
属性或方法对于闭包的访问可见性。闭包的访问可见性和$newscope类的成员函数是相同的。
class Father { protected $pu = "public variable"; protected static $spu = 'public static'; } class Son extends Father { } //Son中的方法可以正常访问Father类中的protected属性 class Other { } //Other中的方法无法访问Father类中的protected属性
测试:
$son = new Son(); $func = function(){ echo $this -> pu; }; (Closure::bind($func, $son, 'Son'))(); 输出 public variable (Closure::bind($func, $son, 'Other'))(); 报错 Fatal error: Uncaught Error: Cannot access protected property Son::$pu
匿名函数都是Closure的实例所以可以调用 bindTo 方法。 bindTo方法 ($func -> bindTo($son, 'Son'))(); ($func -> bindTo($son, 'Other'))();
$newscope默认为‘Static'表示不改变,还是之前的作用域。
class Grand { protected $Grandvar = 'this is grand'; } class Father extends Grand { protected $Fathervar = "this is Father"; } class Mother extends Grand { protected $Mothervar = 'this is Mother'; } class Son extends Father { protected $Sonvar = 'this is son'; } $son = new Son(); $mon = new Mother(); $func = function(){ echo $this -> Grandvar; }; 绑定访问作用域为'Son'的作用域,之后使用之前的默认作用域, 所以可以访问Grandvar $newFunc = Closure::bind($func, $son, 'Son'); $newFunc = Closure::bind($newFunc, $mon); $newFunc(); 未绑定访问作用域,默认没有权限 $newFunc = Closure::bind($func, $mon); $newFunc();
http://php.net/manual/zh/class.closure.php
相关文章推荐
- php中密码的加密处理及安全措施
- SMTP错误码/建议解决方法
- 学习php 韩顺平 数据类型 三元运算,字符串运算类型运算
- php 图片上传预览(转)
- php 如何写入、读取word,excel文档
- PHP......会话控制SESSION与COOKIE
- PHP json_encode中文乱码解决方法
- php-5.3 zend opcache 的设置
- FTP命令全集
- php的错误级别
- php笔记(3)——字符串操作
- ftp服务详解
- Thinkphp 开启字段缓存后,生成字段缓存文件bug修改
- php执行多个存储过程(二)
- php 输出excel
- PHP下的购物车
- composer 安装yii插件 fontawesome
- php执行多个存储过程
- Yii2如何使用存取控制过滤器(ACF)
- PHP生成折线图---Jparaph