publicstatic Closure Closure::bind ( Closure $closure , object$newthis [, mixed$newscope = 'static' ] )

一、函数意义:

  对于 Closure::bind PHP官方文档的解释是:“Closure::bind — 复制一个闭包,绑定指定的$this对象和类作用域。”

  闭包:即匿名函数,匿名函数的另一种叫法。所以前半句的意思,就是“复制一个匿名函数”。

  后半句话,就比较拗口了,“绑定指定的$this对象和类的作用域”。我的理解是:“$this对象”直接理解为“被new()创建的对象”;“类的作用域”即定义类的大括号中间的全部内容。

  至于“绑定”,意思就是,匿名函数在执行时,函数内部的$this(如果函数内部有[$this->成员名]的这种用法的话)是被绑定的,绑定的对象就是参数二的 $newthis;当然,$this肯定是用来被绑定类的实例的,如果想访问类的静态成员的话,就因该用 【类名::成员名】或者【static::成员名】或者【self::成员名】。

  所有,Closure::bind()是匿名函数在处理时,用来绑定类的对象和作用域的(我觉得说成“或”应该更准确一些,现在不用细究,后面会讲到),所以如果你只是单纯的用匿名函数但是却不需要绑定类对象或者制定这个匿名函数的类的作用域的话,就不需要用Closure::bind()方法了。

二、参数说明和用法:

  2.1 第一个参数$closure,其实就是一个匿名函数,之所以参数类型是Closure,这是因为“匿名函数目前是通过 Closure 类来实现的”。

  2.2 第二个参数$newthis,如果匿名函数需要用到类实例的话,就必须传一个类的实例;如果不需要的话,这个参数直接传“null”就可以。

  2.3 第三个参数$newscope,scope的中文意思为“范围,作用域”。如果不指定这个参数,那么默认,在匿名函数内部,只能使用通过$newthis这个参数传入进来的对象的pulic成员;而如果指定了这个参数的话,那么就可访问这个参数所表示的类的作用域内部的所有成员,包括private和protected。

三、举个栗子:

class T {

    private static $name = '我是T里面的私有属性 $name <br>';

    private function show() {
echo "我是T里面的私有函数:show <br>";
} protected function who() {
echo "我是T里面的保护函数:who <br>";
} public function name() {
echo "我是T里面的公共函数:name <br>";
}
} $test = new T(); $func = Closure::bind(function () {
$this->who();
$this->name();
$this->show(); }, $test
); $func();

结果:

Fatal error: Uncaught Error: Call to protected method T::who()

who是protected的,怎么可以在类的外部(类的作用域外)访问呢?,但是我们稍加改造一下:

 class T {

     private static $name = '我是T里面的私有属性 $name <br>';

     private function show() {
echo "我是T里面的私有函数:show <br>";
} protected function who() {
echo "我是T里面的保护函数:who <br>";
} public function name() {
echo "我是T里面的公共函数:name <br>";
}
} $test = new T(); $func = Closure::bind(function () {
$this->who();
$this->name();
$this->show();
}, $test,
T::class//加这个,指定匿名函数可以使用T这个类的作用域。下面两种方式都可以
//'T'
//new T()
); $func();

结果:

是不是很神奇,类的protected和private的成员也可以在类的外部访问。可以理解为,第三个参数,等于是授权了匿名函数,你可以到某个类的作用域内部来访问类的所有成员(包括静态和非静态)。

那么怎么在匿名函数内,访问静态成员呢?很简单,就和真的在类的内部一样,可以使用[self::]或者[类名::]或者[static::]。

具体:

 class T {

     private static $name = '我是T里面的私有属性 $name <br>';

     private function show() {
echo "我是T里面的私有函数:show <br>";
} protected function who() {
echo "我是T里面的保护函数:who <br>";
} public function name() {
echo "我是T里面的公共函数:name <br>";
}
} $test = new T(); $func = Closure::bind(function () {
$this->who();
$this->name();
$this->show(); echo self::$name; //访问静态私有成员
echo static::$name; //访问静态私有成员
}, $test,
T::class//加这个,指定匿名函数可以使用T这个类的作用域。下面两种方式都可以
//'T'
//new T()
); $func();

结果:

php Closure::bind的参数说明的更多相关文章

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

    手册中 Closure::bind — 复制一个闭包,绑定指定的$this对象和类作用域. 具体参数可以看手册,这里记录下这个方法的实际用处. <?php trait MetaTrait { p ...

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

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

  3. PHP Closure类Bind与BindTo方法

    Closure类为闭包类,PHP中闭包都是Closure的实例: 1 $func = function(){}; 2 var_dump($func instanceof Closure); 输出 bo ...

  4. php中怎么理解Closure的bind和bindTo

    bind是bindTo的静态版本,因此只说bind吧.(还不是太了解为什么要弄出两个版本) 官方文档: 复制一个闭包,绑定指定的$this对象和类作用域. 其实后半句表述很不清楚. 我的理解: 把一个 ...

  5. PHP Closure创建匿名函数

    Closure 类 用于代表匿名函数的类. 匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象.在过去,这个类被认为是一个实现细节,但现在可以依赖它做一些事情.自 PHP 5.4 起, 这个 ...

  6. PHP Closure(闭包)类详解

    Closure 面向对象变成语言代码的复用主要采用继承来实现,而函数的复用,就是通过闭包来实现.这就是闭包的设计初衷. 注:PHP里面闭包函数是为了复用函数而设计的语言特性,如果在闭包函数里面访问指定 ...

  7. PHP 中的Closure

    PHP 中的Closure Closure,匿名函数,又称为Anonymous functions,是php5.3的时候引入的.匿名函数就是没有定义名字的函数.这点牢牢记住就能理解匿名函数的定义了. ...

  8. php 中的closure用法

    Closure,匿名函数,是php5.3的时候引入的,又称为Anonymous functions.字面意思也就是没有定义名字的函数.比如以下代码(文件名是do.php) <?php funct ...

  9. PHP 5.x和PHP 7 Closure不同行为问题

    同样一段闭包代码,PHP 7 ok的,PHP 5.5.11(Windows 开发机器)上却报错,以为是PHP 5 bug,原来是用法不对,记录一下~ 原代码(自己写的框架的路由部分)最初是这样写的: ...

随机推荐

  1. 【bzoj1855】 [Scoi2010]股票交易 单调队列优化DP

    上一篇blog已经讲了单调队列与单调栈的用法,本篇将讲述如何借助单调队列优化dp. 我先丢一道题:bzoj1855 此题不难想出O(n^4)做法,我们用f[i][j]表示第i天手中持有j只股票时,所赚 ...

  2. 简单选择排序实现(Java)

    简单选择排序实现 简单选择排序就是通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i (1 ≤ i ≤ n)个记录交换. 代码实现: public class Selec ...

  3. QuantLib 金融计算——修复 BatesProcess 中的两个 Bug

    QuantLib 金融计算--修复 BatesProcess 中的两个 Bug 我发现了 BatesProcess 中的两个 Bug: 基类 HestonProcess::factors 的返回值取决 ...

  4. java内存数据管理

    准确的说应该是java8以前的内存管理方式 区别在永久代(方法区)上 public class RamManager { //1.a存储于永久代 public static int a =1; pri ...

  5. Web自动化 - 选择操作元素 1

    文章转自 白月黑羽教Python 所有的 UI (用户界面)操作 的自动化,都需要选择界面元素. 选择界面元素就是:先让程序能找到你要操作的界面元素. 先找到元素,才能操作元素. 选择元素的方法 程序 ...

  6. Java SPI机制和使用示例

    JAVA SPI 简介 SPI 是 Java 提供的一种服务加载方式,全名为 Service Provider Interface.根据 Java 的 SPI 规范,我们可以定义一个服务接口,具体的实 ...

  7. Linux笔记:vi常用命令

    vi编辑器是所有Unix及Linux系统下标准的编辑器,在很多时候我们都需要使用vi修改服务端配置,vi其实非常强大,只要命令使用熟练的情况下,编辑速度并不亚于现在的图形化编辑器,这里简单地介绍一下它 ...

  8. 数据库学习---SQL基础(二)

    数据库学习---SQL基础(一) 数据库学习---SQL基础(二) 数据库学习---SQL基础(三) 上篇复习的sql的增删改查,and ,or ,>=, <=,!=等逻辑运算符,还有in ...

  9. Impala 使用的端口

    下表中列出了 Impala 是用的 TCP 端口.在部署 Impala 之前,请确保每个系统上这些端口都是打开的. 组件 服务 端口 访问需求 备注 Impala Daemon Impala 守护进程 ...

  10. 直接用php.exe命令还执行php程序跟直接在网页上访问php程序的区别

    1.直接使用php.exe命令执行php程序的格式: php test.php 2.因为没有经过apache或iis这种服务器,所以一些基于服务器的变量是不能使用的, 如$_SERVER,$_ENV等 ...