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这个函数,可以理解成 ...
随机推荐
- POJ 1247
#include<iostream> using namespace std; int main(){ ,sum=; int * guest; do{ sum=; sam_num=; ci ...
- IO概述、异常、File文件类_DAY19
IO概述: 操作数据的工具 IO流,即数据流,数据像水流一样通过IO工具进行传输. 程序 <IO> 硬盘 绝对路径与相对路径 1:异常(理解) (1)就是程序的非正常情况. 异常相关 ...
- Scrapy源码注解--CookiesMiddleware
class CookiesMiddleware(object): """ 中间件在Scrapy启动时实例化.其中jars属性是一个默认值为CookieJar对象的dict ...
- 【优化】如何检测移动端 CPU 以及内存占用率
原文 http://taobaofed.org/blog/2015/12/04/cpu-allocation-profiler/ 前言 6 月底的时候淘宝众筹的 H5 接入到了支付宝钱包,上线前支付 ...
- C/C++ -- Gui编程 -- Qt库的使用 -- 使用小写qDebug调试程序
qDebug作为printf不需要头文件 qDebug()作为cout要使用头文件<QDebug> -----debug.cpp----- -----debug.cpp----- #inc ...
- 微服务Kong(十)——负载均衡参考
KONG为请求多个后端服务提供了多种负载均衡方案:一种是简单的基于DNS,另一种是更加动态的环形均衡器,他在不需要DNS服务器的情况下也允许服务注册. 一.基于DNS的负载均衡 当使用基于DNS的负载 ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- LDA理解
LDA只是一个求解思路. 1.理解LDA首先要理解EM算法,EM不能叫做一个算法,只是一个思想:它要求解的其实是一个极大似然估计,就是我用已知量去求解导致这个已知量出现的最大概率,而在这里又恰恰有点偏 ...
- elasticdump
elasticdump备份elasticsearch里面的某个索引数据 1. 安装环境 需要node.npm.yarn # 去官方下载最新版本的nodejs #wget https://nod ...
- Java运用第三方开源jar包sigar.jar获取服务器信息
通过使用第三方开源jar包sigar.jar我们可以获得本地的信息 一.准备工作 (1)下载jar包和相关文件 资源链接:百度云:链接:https://pan.baidu.com/s/1nxccJHJ ...