php中Closure::bind用法(手册记录)

  手册中 Closure::bind — 复制一个闭包,绑定指定的$this对象和类作用域。

  具体参数可以看手册,这里记录下这个方法的实际用处.

 1 <?php
 2
 3 trait MetaTrait
 4 {
 5     private $methods = [];
 6
 7     public function addMethod($methodName,$methodCallable)
 8     {
 9         if (!is_callable($methodCallable))
10             throw new InvalidArgumentException(‘Second param must be callable‘);
11
12         //改变作用域到 get_called_class 的对象
13         $this->methods[$methodName] = Closure::bind($methodCallable, $this, get_called_class());
14
15     }
16
17     public function __call($methodName, array $args)
18     {
19         if (isset($this->methods[$methodName])){
20             return call_user_func_array($this->methods[$methodName],$args);
21         }
22
23         throw new RuntimeException(‘There is no method with the given name to call‘);
24
25     }
26
27 }
28
29 class HackThursday
30 {
31     use MetaTrait;
32
33     private $dayOfWeek = ‘Thursday‘;
34 }
35
36
37 $test = new HackThursday();
38 $test->addMethod(‘when‘,function(){
39     return $this->dayOfWeek;
40 });
41
42 echo $test->when(); //Thursday

  其实这个方法就是以前说过的 Closure::bindTo() 的静态版本, 和PHP 使用reflection时的问题,以及解决方案这篇一起看加深理解.

时间: 2024-11-09 09:19:45

php中Closure::bind用法(手册记录)的相关文章

Angularjs中UI Router用法小记录

今天自己参考已有的项目代码学习了下UI Router的用法,写了个小demo,验证了下自己的想法,现把使用情况记录一下. 1.入口文件index.html,引入项目所需的js文件,标注ng-app,创建ui-view元素,为后面的嵌套做容器准备. <!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <meta charset="UTF-8">

Oracle中Execute Immediate用法

Oracle中Execute Immediate用法 Execute Immediate代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,Execute Immediate的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用Execute Immediate,因为它获的收益在包之上. -- 使用技巧 1.Execute Immedi

Oracle 中 decode 函数用法

Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN RETURN(翻译值2) ......ELSIF 条件=值n THEN RETURN(翻译值n)ELSE RETURN(缺省值)END IFdecode(字段或字段的运算,值1,值2,值3) 这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值

[转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBox.Show (IWin32Window, String) 在指定对象的前面显示具有指定文本的消息框. MessageBox.Show (String, String) 显示具有指定文本和标题的消息框.由 .NET Compact Framework 支持. MessageBox.Show (IWi

LoadRunner中常用函数参考手册

基础篇1:LoadRunner中常用函数参考手册 常用函数列表 web_url web_submmit_form VS web_submmit_data VS web_custom_request web_custom_request web_concurrent_start(NULL); web_concurrent_end(NULL); ============================分割线================================ 1. web_url Loa

Asp.net中的ViewState用法

基本理论: session值是保存在服务器内存上,那么,可以肯定,大量的使用session将导致服务器负担加重. 而viewstate由于只是将数据存入到页面隐藏控件里,不再占用服务器资源,因此, 我们可以将一些需要服务器"记住"的变量和对象保存到viewstate里面. 而sesson则只应该应用在需要跨页面且与每个访问用户相关的变量和对象存储上. 另外,session在默认情况下20分钟就过期,而viewstate则永远不会过期. 数据类型: 但viewstate并不是能存储所有的

SQL Server 中 RAISERROR 的用法(转)

在存储过程中进程会处理一些逻辑性的错误,如:将RMB转换为USD时,没有查询到想要的汇率 这个时候最好在存储过程中抛个异常,方便自己查找错误信息... 其语法如下: RAISERROR ( { msg_id | msg_str | @local_variable }                    { ,severity ,state }                    [ ,argument [ ,...n ] ]           )          [ WITH optio

mysql中UNION ALL用法

MYSQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果. 举例说明: select * from table1 union select * from table2 这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序. MySQL中的UNION ALL UNION ALL只是简单的将两个结果合并后就返回.这样,如果返回的两个结果集

numpy函数库中一些常用函数的记录

numpy函数库中一些常用函数的记录 最近才开始接触python,python中为我们提供了大量的库,不太熟悉,因此在<机器学习实战>的学习中,对遇到的一些函数的用法进行记录. (1)mat( ) numpy函数库中存在两种不同的数据类型(矩阵matrix和数组array),都可以用于处理行列表示的数字元素.虽然他们看起来很相似,但是在这两个数据类型上执行相同的数学运算可以得到不同的结果,其中numpy函数库中matrix与MATLAB中matrices等价. 调用mat( )函数可以将数组转