看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
中的call
或apply
, 有點類似.
其實就是把閉包當成物件的成員方法或是靜態成員方法.
<code class="php">Closure::bind($cl1, null, 'A'); //就相当于在类里面加了个静态成员方法 Closure::bind($cl2, new A(), 'A'); //相当于在类里面加了个成员方法</code>
成員方法中使用$this
存取物件, 靜態成員方法直接使用類別名稱::成員
的方法.
但是因為是匿名函數, 沒有函數名稱, 所以傳回一個已經綁定$this物件和類別作用域的閉包給你使用.