2013-10-24 136 views
0

我在讀WordPress的教​​程中作者用這樣的事情(我簡化它):匿名函數返回類屬性? PHP

class WPObject { 
    public $ID; 
    public $title; 
    public $content; 
    public $status; 

    public function __construct($wp_post) { 
     $modifiers = [ 
      'key' => function($k, $v) { 
       return (substr($k, 0, 5) === "post_") ? substr($k, 5) : $k; 
      } 
     ]; 
    } 
} 

功能應該刪除從WP查詢對象的post_前綴。我的問題是關於我上面發佈的功能。這個匿名函數似乎會返回一個帶有屬性的對象。當我做了它,我得到的print_r ...

Array 
(
    [key] => Closure Object 
     (
      [this] => WPObject Object 
       (
        [ID] => 
        [title] => 
        [content] => 
        [status] => 
       ) 

      [parameter] => Array 
       (
        [$k] => 
        [$v] => 
       ) 
     ) 
) 

我還在學習有關匿名函數,並想知道如何/爲什麼它這樣做?如果你從一個對象中調用一個匿名函數,它是否會創建該對象的一個​​實例?

另外,對不起,如果我使用不正確的術語。沒有匿名函數,閉包,lambda函數還沒有完成。

+0

它只是給你'$ this'的值,它是'WPObject'類的一個實例 – Phil

回答

1

不是情況下,它必須在創建它的相同對象,因爲PHP 5.4,我相信一個參考。所以閉包本身可以調用該類的屬性或方法,就好像在該類中一樣。

class foo { 
     public $bar = 'something'; 
     function getClosure(){ 
      return function(){ 
      var_dump($this->bar); 
      }; 
     } 
    } 

$object = new foo(); 
$closure = $object->getClosure(); 
//let's inspect the object 
var_dump($object); 
//class foo#1 (1) { 
// public $bar => 
// string(9) "something" 
//} 

//let's see what ->bar is 
$closure(); 
//string(9) "something" 

//let's change it to something else 
$object->bar = 'somethingElse'; 

//closure clearly has the same object: 
$closure(); 
//string(13) "somethingElse" 

unset($object); 
//no such object/variables anymore 
var_dump($object); 
//NULL (with a notice) 

//but closure stills knows it as it has a reference 
$closure(); 
//string(13) "somethingElse" 
+0

感謝你的演練。我只是不知疲倦地纏着它,這對我很有幫助 – ahnkee