Объявление анонимной функции в новом stdClass - PullRequest
9 голосов
/ 20 февраля 2012

Просто интересно, почему что-то подобное не работает:

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 ]

8 голосов
/ 20 февраля 2012

PHP прав, когда вызывает фатальную ошибку Call to undefined method stdClass::city(), потому что у объекта $class->address('name') нет метода city. В сущности, этот объект имеет свойство city, которое является экземпляром класса закрытия (http://www.php.net/manual/en/class.closure.php) Вы можете проверить это: var_dump($class->address('name')->city)

Я нашел способ вызвать эту анонимную функцию:

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

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

4 голосов
/ 12 сентября 2012

К сожалению, это невозможно в 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 голосов
/ 20 февраля 2012

AFAIK, это не поддерживается PHP, и вы должны использовать функции call_user_func() или call_user_func_array() для вызова замыканий, назначенных свойствам класса (обычно вы можете использовать __call() для этого, но в вашем случае класс stdClass, так что это невозможно).

...