在新的stdClass中声明一个匿名函数


Declaring an anonymous function within new 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不支持这一点,以及为什么。

PHP在调用致命错误Call to undefined method stdClass::city()时是正确的,因为对象$class->address('name')没有方法city。Intead,此对象具有属性city,它是闭包类的实例(http://www.php.net/manual/en/class.closure.php)您可以验证:var_dump($class->address('name')->city)

我发现调用这个匿名函数的方法是:

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

希望这能有所帮助!

遗憾的是,这在stdClass中是不可能的,但有一个变通方法——PHP匿名对象。

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

AFAIK,PHP不支持这一点,您必须使用call_user_func()call_user_func_array()函数来调用分配给类属性的闭包(通常您可以使用__call()来执行此操作,但在您的情况下,类是stdClass,因此这是不可能的)。