2012-02-20 4 views
9

prostu zastanawiasz się, dlaczego coś takiego nie działa:Deklarowanie anonimowej funkcji w nowych 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]; 
} 

Nazywając to jak echo $class->address('name')->city('Class') należy po prostu echo Class jednak mam Fatal error: Call to undefined method stdClass::city()

mogę znaleźć lepszy sposób, aby to zrobić, ponieważ będzie się bałagan, ale zastanawiam się, co mogę robić źle tam, lub jeśli PHP nie obsługuje tego i dlaczego.

Odpowiedz

8

PHP ma rację, kiedy wywołać błąd krytyczny Call to undefined method stdClass::city() ponieważ obiekt $class->address('name')ma metodęcity. intead ten obiekt ma właściwośćcity który jest instancją zamykania klasy (http://www.php.net/manual/en/class.closure.php) Można to sprawdzić: var_dump($class->address('name')->city)

znalazłem drogę do wywołania tej anonimowej funkcji jest następująca:

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

Mam nadzieję że to pomoże!

2

AFAIK, to nie jest obsługiwana przez PHP i trzeba użyć call_user_func() lub call_user_func_array() funkcje zadzwonić zamknięć przypisane do właściwości klasy (zwykle można użyć __call() to zrobić, ale w twoim przypadku, klasa jest stdClass, więc to nie jest możliwe).

4

Niestety nie jest to możliwe w ramach standardu stdClass, ale istnieje obejście - PHP Anonymous Object.

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