PHP 的Closure的bind 詳細介紹

張優傳發表於2018-03-23

原文: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();



相關文章