PHP Closure類別的bind()和bindTo()怎麼用?

WBOY
發布: 2016-10-17 09:30:13
原創
1568 人瀏覽過

看PHP手冊關於Closure的bind和bindTo的用法。真心沒看懂,不懂其中的概念。
例如Closure::bind ,手冊上說「複製一個閉包,綁定指定的$this物件和類別作用域」。這該怎麼去理解?
閉包和$this是用怎樣的形式綁在一起的?類別作用域又是做什麼用的?
還有,一個是靜態版本,一個是動態版本,這個指的是什麼?
能否用給出的範例解釋一下這些概念呢?

<code><?php
class A {
    private static $sfoo = 1;
    private $ifoo = 2;
}
$cl1 = static function() {
    return A::$sfoo;
};
$cl2 = function() {
    return $this->ifoo;
};

$bcl1 = Closure::bind($cl1, null, 'A');
$bcl2 = Closure::bind($cl2, new A(), 'A');
echo $bcl1(), "\n";
echo $bcl2(), "\n";
?></code>
登入後複製
登入後複製

謝謝

回覆內容:

看PHP手冊關於Closure的bind和bindTo的用法。真心沒看懂,不懂其中的概念。
例如Closure::bind ,手冊上說「複製一個閉包,綁定指定的$this物件和類別作用域」。這該怎麼去理解?
閉包和$this是用怎樣的形式綁在一起的?類別作用域又是做什麼用的?
還有,一個是靜態版本,一個是動態版本,這個指的是什麼?
能否用給出的範例解釋一下這些概念呢?

<code><?php
class A {
    private static $sfoo = 1;
    private $ifoo = 2;
}
$cl1 = static function() {
    return A::$sfoo;
};
$cl2 = function() {
    return $this->ifoo;
};

$bcl1 = Closure::bind($cl1, null, 'A');
$bcl2 = Closure::bind($cl2, new A(), 'A');
echo $bcl1(), "\n";
echo $bcl2(), "\n";
?></code>
登入後複製
登入後複製

謝謝

不知道你有沒有用過js中的callapply, 有點類似.

其實就是把閉包當成物件的成員方法或是靜態成員方法.

<code class="php">Closure::bind($cl1, null, 'A'); //就相当于在类里面加了个静态成员方法
Closure::bind($cl2, new A(), 'A'); //相当于在类里面加了个成员方法</code>
登入後複製

成員方法中使用$this存取物件, 靜態成員方法直接使用類別名稱::成員的方法.
但是因為是匿名函數, 沒有函數名稱, 所以傳回一個已經綁定$this物件和類別作用域的閉包給你使用.

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板