PHP 的Closure的bind 详细介绍

原文:https://www.cnblogs.com/eleven24/p/7487923.html


1、只绑定$this对象.
2、只绑定类作用域.
3、同时绑定$this对象和类作用域.(文档的说法)

4、都不绑定.(这样一来只是纯粹的复制, 文档说法是使用cloning代替bind或bindTo)

第一种 只绑定$this对象

$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();

第二种 只绑定类作用域.

$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();

第三种 同时绑定$this对象和类作用域.(文档的说法)

$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();


4、都不绑定.(这样一来只是纯粹的复制, 文档说法是使用cloning代替bind或bindTo)

$closure  function  () {
     echo  "bind nothing.\n" ;
};
 
//与$bound_closure = clone $closure;的效果一样
$bound_closure  = Closure::bind( $closure , null);
 
$bound_closure ();



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值