php Closure::bind的用法(转)
官方文档:Closure 类
原文:php中怎么理解Closure的bind和bindTo
bind是bindTo的静态版本,因此只说bind吧。(还不是太了解为什么要弄出两个版本)
官方文档: 复制一个闭包,绑定指定的$this对象和类作用域。
其实后半句表述很不清楚。 我的理解: 把一个闭包转换为某个类的方法(只是这个方法不需要通过对象调用), 这样闭包中的$this、static、self就转换成了对应的对象或类。
因为有几种情况:
1、只绑定$this对象.
2、只绑定类作用域.
3、同时绑定$this对象和类作用域.(文档的说法)
4、都不绑定.(这样一来只是纯粹的复制, 文档说法是使用cloning代替bind或bindTo)
下面详细讲解这几种情况:
1、只绑定$this对象
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
$closure = function ($name, $age) { $this->name = $name; $this->age = $age;};class Person { public $name; public $age; public function say() { echo "My name is {$this->name}, I'm {$this->age} years old.\n"; }}$person = new Person();//把$closure中的$this绑定为$person//这样在$bound_closure中设置name和age的时候实际上是设置$person的name和age//也就是绑定了指定的$this对象($person)$bound_closure = Closure::bind($closure, $person);$bound_closure('php', 100);$person->say(); |
|
1
|
My name is php, I’m 100 years old. |
注意: 在上面的这个例子中,是不可以在$closure中使用static的,如果需要使用static,通过第三个参数传入带命名空间的类名。
2、只绑定类作用域.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
$closure = function ($name, $age) { static::$name = $name; static::$age = $age;};class Person { static $name; static $age; public static function say() { echo "My name is " . static::$name . ", I'm " . static::$age. " years old.\n"; }}//把$closure中的static绑定为Person类//这样在$bound_closure中设置name和age的时候实际上是设置Person的name和age//也就是绑定了指定的static(Person)$bound_closure = Closure::bind($closure, null, Person::class);$bound_closure('php', 100);Person::say(); |
|
1
|
My name is php, I’m 100 years old. |
注意: 在上面的例子中,是不可以在$closure中使用$this的,因为我们的bind只绑定了类名,也就是static,如果需要使用$this,新建一个对象作为bind的第二个参数传入。
3、同时绑定$this对象和类作用域.(文档的说法)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
$closure = function ($name, $age, $sex) { $this->name = $name; $this->age = $age; static::$sex = $sex;};class Person { public $name; public $age; static $sex; public function say() { echo "My name is {$this->name}, I'm {$this->age} years old.\n"; echo "Sex: " . static::$sex . ".\n"; }}$person = new Person();//把$closure中的static绑定为Person类, $this绑定为$person对象$bound_closure = Closure::bind($closure, $person, Person::class);$bound_closure('php', 100, 'female');$person->say(); |
|
1
|
My name is php, I’m 100 years old. Sex: female. |
在这个例子中可以在$closure中同时使用$this和static
4、都不绑定.(这样一来只是纯粹的复制, 文档说法是使用cloning代替bind或bindTo)
|
1
2
3
4
5
6
7
8
|
$closure = function () { echo "bind nothing.\n";};//与$bound_closure = clone $closure;的效果一样$bound_closure = Closure::bind($closure, null);$bound_closure(); |
|
1
|
bind nothing. |
这个就用clone好了吧…
php Closure::bind的用法(转)的更多相关文章
- php中Closure::bind用法(手册记录)
手册中 Closure::bind — 复制一个闭包,绑定指定的$this对象和类作用域. 具体参数可以看手册,这里记录下这个方法的实际用处. <?php trait MetaTrait { p ...
- php Closure::bind的参数说明
publicstatic Closure Closure::bind ( Closure $closure , object$newthis [, mixed$newscope = 'static' ...
- js中call、apply、bind的用法
原文链接:http://www.cnblogs.com/xljzlw/p/3775162.html var zlw = { name: "zlw", sayHello: funct ...
- js中bind的用法,及与call和apply的区别
call和apply的使用和区别不再做阐述,可以参考我的另一篇随笔<JavaScript中call和apply方法的使用>(https://www.cnblogs.com/lcr-smg/ ...
- call、apply、bind的用法
数组追加 //用apply拼接 var arr1=[12,'name:foo',2048]; var arr2=['Joe','Hello']; Array.prototype.push.apply( ...
- C++标准 bind函数用法与C#简单实现
在看C++标准程序库书中,看到bind1st,bind2nd及bind的用法,当时就有一种熟悉感,仔细想了下,是F#里提到的柯里化.下面是维基百科的解释:在计算机科学中,柯里化(英语:Currying ...
- JavaScript学习(2)call&apply&bind&eval用法
javascript学习(2)call&apply&bind&eval用法 在javascript中存在这样几种特别有用的函数,能方便我们实现各种奇技淫巧.其中,call.bi ...
- javascript中call()、apply()、bind()的用法理解
一.bind的用法 第一个:obj.showInfo('arg','arg_18');中传的2个参数通过showInfo方法改变的是obj下中的name和age 第二个:obj.showInfo.bi ...
- call,apply,bind的用法
关于call,apply,bind这三个函数的用法,是学习javascript这门语言无法越过的知识点.下边我就来好好总结一下它们三者各自的用法,及常见的应用场景. 首先看call这个函数,可以理解成 ...
随机推荐
- 一分钟搞懂 JavaScript this 指向问题
关于Javascript的this指向问题,网络上有很多分析文章,写的很好,比如这里和这里 我这里做一个简单的总结. 箭头函数的 this 箭头函数内的this指向外层函数定义时所在的作用域.如果没有 ...
- 使用SecureCRT的SFTP传输文件
使用SecureCRT的SFTP传输文件 使用 FileZilla 上传项目更新,因为软件缓存没处理好,三个文件花了三个小时~~ 找一种缓存干扰最小的方式上传文件. 1.在使用 SecureCRT 连 ...
- Centos出现-bash: unzip: command not found的解决办法
利用unzip命令解压缩的时候,出现-bash: unzip: command not found的错误. unzip——命令没有找到,其原因肯定是没有安装unzip. 利用一句命令就可以解决了. ...
- 剑指offer三十一之连数中1出现的次数(从1到n整数中1出现的次数
一.题目 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- Hadoop集群维护
HDFS小文件问题及解决方案:http://dongxicheng.org/mapreduce/hdfs-small-files-solution/ Hadoop升级方案(一):Hadoop 1.0内 ...
- jython实现java运行python代码
Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现.最近的一个项目需要将python代码转换成java实现,所以用了一 ...
- Android_ActionBar
ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true);//在activity title栏的左 ...
- 怎么将一张100KB以上大小的电子图片压缩成30KB以内
不多说,直接上干货! 方法一: 怎么将一张100KB以上大小的电子照片压缩成30KB以内. 先将这张100KB以上大小的电子照片,新建一个word,放入.选中照片,右击,另存为,格式依然还是选择.jp ...
- Vue图片懒加载之lazyload插件使用
当内容没有加载完的时候,用户体验不是很好,这时候,可以使用lazyload这个插件,提升用户体验,使用方法特别简单易用 一. vue lazyload插件: 插件地址:https://github.c ...
- Node.js http服务器搭建和发送http的get、post请求
1.Node.js 搭建http服务器 1.1创建server.js var http = require('http'); var querystring = require('querystrin ...