2017-09-15 56 views
0

PHP手冊對Closure::bind()提供的解釋很少,該示例也令人困惑。什麼是PHP中的Closure :: bind()

下面是網站上的代碼示例:

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"; 

什麼是封閉的參數:: bind()的?

上面使用了Null,甚至使用了「new」關鍵字,這使得我更加困惑。

+3

檢查[bindTo()](http://php.net/manual/en/closure.bindto.php)。這裏有更多的解釋。 'bind()'只是靜態版本 –

回答

1

如果你把$cl2價值爲A類的方法,類看起來是這樣的:

class A { 
    public $ifoo = 2; 

    function cl2() 
    { 
     return $this->ifoo; 
    } 
} 

,你可以使用它像這樣:

$x = new A(); 
$x->cl2(); 
# it prints 
2 

但是,由於$cl2是封閉式的,而不是類A的成員,上面的使用代碼不起作用。

方法Closure::bindTo()允許使用封閉件,因爲它是A類的方法:

$cl2 = function() { 
    return $this->ifoo; 
}; 

$x = new A(); 
$cl3 = $cl2->bindTo($x); 
echo $cl3(); 
# it prints 2 

$x->ifoo = 4; 
echo $cl3(); 
# it prints 4 now 

封閉使用的$this$this的值不會在$cl2定義。 當$cl2()運行時,$thisNULL並且它觸發了一個錯誤(「PHP致命錯誤:當不在對象上下文中時使用$this)。

Closure::bindTo()創建一個新的閉包,但它將此新閉包中的$this的值「綁定」到它作爲其第一個參數接收的對象上。

$cl3中存儲的代碼中,$this與全局變量$x具有相同的值。當$cl3()運行時,$this->ifoo是對象$x中的ifoo的值。

Closure::bind()Closure::bindTo()的靜態版本。它具有與Closure::bindTo()相同的行爲,但需要額外的參數:第一個參數必須是要綁定的閉包。

相關問題