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

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

 <?php

 trait MetaTrait
{
private $methods = []; public function addMethod($methodName,$methodCallable)
{
if (!is_callable($methodCallable))
throw new InvalidArgumentException('Second param must be callable'); //改变作用域到 get_called_class 的对象
$this->methods[$methodName] = Closure::bind($methodCallable, $this, get_called_class()); } public function __call($methodName, array $args)
{
if (isset($this->methods[$methodName])){
return call_user_func_array($this->methods[$methodName],$args);
} throw new RuntimeException('There is no method with the given name to call'); } } class HackThursday
{
use MetaTrait; private $dayOfWeek = 'Thursday';
} $test = new HackThursday();
$test->addMethod('when',function(){
return $this->dayOfWeek;
}); echo $test->when(); //Thursday

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

 

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

  1. php Closure::bind的用法(转)

    官方文档:Closure 类 原文:php中怎么理解Closure的bind和bindTo bind是bindTo的静态版本,因此只说bind吧.(还不是太了解为什么要弄出两个版本) 官方文档: 复制 ...

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

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  3. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  4. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

  5. Spring中的BeanUtils与apache commons中的BeanUtils用法[1]

    1. 前言 在开发过程中,经常遇到把要给一个bean的属性赋给另外一个bean.最笨的方法是每个属性都单独写一个,聪明的方法是应用反射写一个工具方法.考虑到这个需求基本每个程序员都会遇到,那么一定已经 ...

  6. sql语句中charindex的用法 可用于截取字符串

    使用CHARINDEX和PATINDEX函数来搜索文字列和字符串.这两个函数是如何运转的,解释他们的区别.同时提供一些例子,通过这些例子,你可以可以考虑使用这两个函数来解决很多不同的字符搜索的问题. ...

  7. mysql中limit的用法实例解析

    mysql中limit的用法解析. 在mysql中,select * from table limit m,n.其中m是指记录开始的index,从0开始,n是指从第m条开始,取n条. 例如: mysq ...

  8. php中setcookie函数用法详解(转)

    php中setcookie函数用法详解:        php手册中对setcookie函数讲解的不是很清楚,下面是我做的一些整理,欢迎提出意见.        语法:        bool set ...

  9. SQL中Merge的用法

    SQL中Merge的用法 Merge的用法 Merge可以完成以下功能: 1.  两个表之间数据的更新 2.  进行进销存更新库存 3.  进行表之间数据的复制 语法说明: 1.  在语句结束后一定要 ...

随机推荐

  1. Python copy and deepcopy

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...

  2. 基于Open vSwitch搭建虚拟路由器

    As part of my work in OpenDaylight, we are looking at creating a router using Open vSwitch... Why? W ...

  3. C#:org.in2bits.MyXls 文本格式日期 转换,以及设置单元格格式,保留两位小数点

    org.in2bits.MyXls  Excel导入日期格式的处理 表格内容为 2014-7-22 ,导入后显示为 41842 等于一个数值,根本不是日期,后来百度了一下,发现要做如下处理: stri ...

  4. Swagger+Spring mvc生成Restful接口文档

    简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集 ...

  5. android学习笔记55——ContentProvider_2

    实现ContentProvider 创建ContentProvider的步骤: 1.开发一个ContentProvider的子类,该子类需要实现增.删.改.查等方法: 2.在AndroidMainfe ...

  6. winform中DataGrid控件的宽度设置

    最近修改一个win5.0的PDA程式,碰到一个问题.就是给DataGrid控件绑定数据的时候,这个控件的宽度不能调整,有时候数据较长,就显示不全.然后想在程式里自定义它的宽度,设置不成功.然后网上没找 ...

  7. 继承extends

    class Person{ String name; int age; void eat(){ System.out.println("吃饭"); } void introduce ...

  8. mac与php环境

    一.目录 apache目录:/etc/apache2/ mysql目录:/usr/local/mysql/ 站点目录:/Library/WebServer/Documents/ 二.mac系统给文件夹 ...

  9. No.1__C#

    这是第一篇C#的日记,到现在为止已经学习了一个礼拜的C#了.由于是实习中才开始学习,所以这次不准备像在大学学习那样,拿着课本划重点,背概念.这应当是一门实践的课程,应该一边编程,一边学.这是到公司第一 ...

  10. python_day2

    一.字符串的基本使用 #!/usr/bin/env python #!-*- coding:utf-8 -*- #!/usr/bin/env python  指定解释器为python abc='hel ...