2012-02-20 48 views
9

只是想知道一個匿名函數,爲什麼這樣的事情不工作:聲明中的新stdClass的

public function address($name){ 
    if(!isset($this->addresses[$name])){ 
     $address = new stdClass(); 
     $address->city = function($class = '', $style = ''){ 
      return $class; 
     };   
     $this->addresses[$name] = $address; 
    } 
    return $this->addresses[$name]; 
} 

調用它像echo $class->address('name')->city('Class')應該只是附和Class,但是我得到Fatal error: Call to undefined method stdClass::city()

我能找到一個更好的這樣做的方式,因爲這會變得混亂,但我想知道我可能在那裏做錯了,或者如果PHP不支持這個,爲什麼。

回答

8

PHP是正確的,當調用致命錯誤Call to undefined method stdClass::city()因爲對象$class->address('name')沒有方法city。 這一翻譯,這個對象擁有財產city是封閉類的實例(http://www.php.net/manual/en/class.closure.php) 您可以驗證這一點:var_dump($class->address('name')->city)

我發現調用這個匿名函數的方法是:

$closure = $class->address('name')->city; 
$closure('class'); 

希望這可以幫助!

2

AFAIK,這不是由PHP支持,你必須使用call_user_func()call_user_func_array()功能調用分配給類的屬性(通常可以使用__call()要做到這一點,但在你的情況下,類是stdClass關閉,所以這是不可能的)。

4

可悲的是它不可能在stdClass中,但有一個解決方法 - PHP Anonymous Object

// define by passing in constructor 
$anonim_obj = new AnObj(array(
    "foo" => function() { echo "foo"; }, 
    "bar" => function($bar) { echo $bar; } 
)); 

$anonim_obj->foo(); // prints "foo" 
$anonim_obj->bar("hello, world"); // prints "hello, world"