Объявление анонимной функции в новом 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') должен просто echo Class , но я получаю Fatal error: Call to undefined method stdClass::city()

Я могу найти лучший способ сделать это, потому что это будет беспорядочно, но мне интересно, что я могу делать неправильно там, или если PHP не поддерживает это и почему.

Related of "Объявление анонимной функции в новом stdClass"

PHP прав при вызове фатальной ошибки. Call to undefined method stdClass::city() потому что объект $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'); 

Надеюсь это поможет!

К сожалению, это невозможно в 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 , так что это невозможно).