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

9

我想知道为什么这样的代码不起作用:

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不支持这种写法并且原因是什么。

3个回答

9

当对象 $class->address('name') 没有方法 city 时,PHP 在调用致命错误 Call to undefined method stdClass::city() 时是正确的。

相反,这个对象 有一个属性 city,它是闭包类 (http://www.php.net/manual/en/class.closure.php) 的实例。您可以通过以下方式进行验证:var_dump($class->address('name')->city)

我找到了调用这个匿名函数的方法:

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

希望这能帮到您!

5

很遗憾,这在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"

2
据我所知,PHP不支持此功能,您必须使用call_user_func()call_user_func_array()函数调用分配给类属性的闭包(通常可以使用__call()来实现,但在您的情况下,该类是stdClass,因此这不可能)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接