Просто интересно, почему что-то вроде этого не работает:
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 не поддерживает это и почему.
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
, так что это невозможно).