2012-02-20 16 views
9

preguntaba por qué algo como esto no funciona:Declarar una función anónima dentro de los nuevos 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]; 
} 

Llamarlo como echo $class->address('name')->city('Class') solo debe hacerse eco Class, sin embargo consigo Fatal error: Call to undefined method stdClass::city()

puedo encontrar una mejor forma de hacerlo, porque esto se complicará, pero me pregunto qué podría estar haciendo mal allí, o si PHP no es compatible con esto y por qué.

Respuesta

8

PHP es correcta cuando invocar error fatal Call to undefined method stdClass::city() porque objeto $class->address('name')no tiene ningún métodocity. Intead, este objeto tiene la propiedadcity que es instancia de Cierre Clase (http://www.php.net/manual/en/class.closure.php) Usted puede verificar esto: var_dump($class->address('name')->city)

he encontrado la manera de llamar a esta función anónima es:

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

¡Espero que esto ayude!

2

yo sepa, esto no es apoyado por PHP, y debe utilizar los call_user_func() o call_user_func_array() funciones llamar cierres asignados a las propiedades de clase (por lo general se puede utilizar __call() para hacer esto, pero en su caso, la clase es stdClass, por lo esto no es posible).

4

Lamentablemente no es posible dentro de stdClass, pero hay una solución alternativa: 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" 
Cuestiones relacionadas