Creando objetos anónimos en php

Como sabemos, crear objetos anónimos en JavaScript es fácil, como el siguiente código:

var object = { p : "value", p1 : [ "john", "johnny" ] } ; alert(object.p1[1]) ; 

Salida:

 an alert is raised with value "johnny" 

¿Se puede aplicar esta misma técnica en el caso de PHP? ¿Podemos crear objetos anónimos en PHP?

Han pasado algunos años, pero creo que necesito mantener la información actualizada.

En php-7 es posible crear clases anónimas, por lo que puedes hacer cosas como esta:

  

Puede leer más sobre esto en el RFC (Se acepta): https://wiki.php.net/rfc/anonymous_classes

Pero no sé qué tan similar se implementa a Javscript, por lo que puede haber algunas diferencias entre las clases anónimas en javascript y php.

Editar:

A partir de los comentarios publicados, aquí está el enlace al manual ahora: http://php.net/manual/en/language.oop5.anonymous.php

“Anónimo” no es la terminología correcta cuando se habla de objetos. Sería mejor decir “objeto de tipo anónimo”, pero esto no se aplica a PHP.

Todos los objetos en PHP tienen una clase. La clase “predeterminada” es stdClass , y puede crear objetos de esta manera:

 $obj = new stdClass; $obj->aProperty = 'value'; 

También puede aprovechar el lanzamiento de una matriz a un objeto para obtener una syntax más conveniente:

 $obj = (object)array('aProperty' => 'value'); print_r($obj); 

Sin embargo, tenga en cuenta que lanzar una matriz a un objeto es probable que arroje resultados “interesantes” para esas claves de matriz que no son nombres de variable válidos de PHP; por ejemplo, esta es una respuesta mía que muestra qué sucede cuando las claves comienzan con dígitos.

¡Sí, es posible! Usando esta simple clase de Objeto PHP Anónimo . Cómo funciona:

 // 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" // define at runtime $anonim_obj->zoo = function() { echo "zoo"; }; $anonim_obj->zoo(); // prints "zoo" // mimic self $anonim_obj->prop = "abc"; $anonim_obj->propMethod = function() use($anonim_obj) { echo $anonim_obj->prop; }; $anonim_obj->propMethod(); // prints "abc" 

Por supuesto, este objeto es una instancia de la clase AnObj , por lo que no es realmente anónimo, pero permite definir métodos sobre la marcha, como JavaScript.

Hasta hace poco, así es como creé objetos sobre la marcha.

 $someObj = json_decode("{}"); 

Entonces:

 $someObj->someProperty = someValue; 

Pero ahora voy con:

 $someObj = (object)[]; 

Entonces como antes:

 $someObj->someProperty = someValue; 

Por supuesto, si ya conoce las propiedades y los valores, puede configurarlos en el interior como se ha mencionado anteriormente:

 $someObj = (object)['prop1' => 'value1','prop2' => 'value2']; 

NB: No sé en qué versiones de PHP esto funciona, así que tendrías que ser consciente de eso. Pero creo que el primer enfoque (que también es corto si no hay propiedades para establecer en la construcción) debería funcionar para todas las versiones que tengan json_encode / json_decode

Si desea imitar a JavaScript, puede crear un Object clase, y así obtener el mismo comportamiento. Por supuesto, esto ya no es bastante anónimo, pero funcionará.

 {func_get_arg($i)} = func_get_arg($i + 1) ; } } } $o = new Object( 'aProperty', 'value', 'anotherProperty', array('element 1', 'element 2')) ; echo $o->anotherProperty[1]; ?> 

Eso dará salida al elemento 2 . Esto fue robado de un comentario en PHP: Clases y Objetos .

¿Se puede aplicar esta misma técnica en el caso de PHP?

No, porque JavaScript utiliza prototipos / statement directa de objetos: en PHP (y en muchos otros lenguajes de OO), un objeto solo se puede crear a partir de una clase.

Entonces la pregunta es: ¿puedes crear una clase anónima?

Una vez más, la respuesta es no: ¿cómo crearías una instancia de la clase sin poder hacer referencia a ella?

Si desea crear un objeto (como en javascript) con propiedades dinámicas, sin recibir una advertencia de propiedad indefinida, cuando no ha establecido un valor para la propiedad

 class stdClass { public function __construct(array $arguments = array()) { if (!empty($arguments)) { foreach ($arguments as $property => $argument) { if(is_numeric($property)): $this->{$argument} = null; else: $this->{$property} = $argument; endif; } } } public function __call($method, $arguments) { $arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this). if (isset($this->{$method}) && is_callable($this->{$method})) { return call_user_func_array($this->{$method}, $arguments); } else { throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()"); } } public function __get($name){ if(property_exists($this, $name)): return $this->{$name}; else: return $this->{$name} = null; endif; } public function __set($name, $value) { $this->{$name} = $value; } } $obj1 = new stdClass(['property1','property2'=>'value']); //assign default property echo $obj1->property1;//null echo $obj1->property2;//value $obj2 = new stdClass();//without properties set echo $obj2->property1;//null