只是想知道为什么这样的事情不起作用:
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()
,但我得到{{1}}
我可以找到更好的方法来做到这一点,因为这会变得混乱,但我想知道我在那里做错了什么,或者PHP是否支持这个以及为什么。
答案 0 :(得分:8)
在调用致命错误Call to undefined method stdClass::city()
时,PHP是正确的,因为对象$class->address('name')
没有方法 city
。
Intead,此对象具有属性 city
,它是Closure类的实例(http://www.php.net/manual/en/class.closure.php)
您可以验证这一点:var_dump($class->address('name')->city)
我发现调用这个匿名函数的方法是:
$closure = $class->address('name')->city;
$closure('class');
希望这有帮助!
答案 1 :(得分: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"
答案 2 :(得分:2)
AFAIK,PHP不支持此功能,您必须使用call_user_func()
或call_user_func_array()
函数调用分配给类属性的闭包(通常可以使用__call()
来执行此操作,但在你的情况下,该类是stdClass
,所以这是不可能的。)