una que objetos objeto new llamar example como clases clase array php object literals object-literal

objetos - que es un objeto en php



Literal de objeto PHP (9)

A partir de PHP 5.4 también puede usar la sintaxis de matriz corta:

$json = [ (object) [''name'' => ''John'', ''hobby'' => ''hiking''], (object) [''name'' => ''Jane'', ''hobby'' => ''dancing''], ];

En PHP, puedo especificar literales de matriz bastante fácilmente:

array( array("name" => "John", "hobby" => "hiking"), array("name" => "Jane", "hobby" => "dancing"), ... )

Pero, ¿y si quiero una matriz de objetos? ¿Cómo puedo especificar el objeto literal en PHP? Es decir, en javascript sería:

[ {name: "John", hobby: "hiking"}, {name: "Jane", hobby: "dancing"} ]


Aunque la conversión como un (objeto) funciona bien en un solo nivel jerárquico, no profundiza. En otras palabras, si queremos objetos en todos los niveles, tendríamos que hacer algo como:

$foods = (object)[ "fruits" => (object)["apple" => 1, "banana" => 2, "cherry" => 3], "vegetables" => (object)["asparagus" => 4, "broccoli" => 5, "carrot" => 6] ];

Sin embargo, en lugar de hacer múltiples lanzamientos como objetos, podemos envolver todo en json_encode y json_decode así:

$foods = json_decode(json_encode([ "fruits" => ["apple" => 1, "banana" => 2, "cherry" => 3], "vegetables" => ["asparagus" => 4, "broccoli" => 5, "carrot" => 6] ]));

Eso asegura que es un objeto en el nivel más profundo.


Como BoltClock mencionó, no hay ningún objeto literal en PHP; sin embargo, puedes hacer esto simplemente escribiendo "casting the arrays" a los objetos:

$testArray = array( (object)array("name" => "John", "hobby" => "hiking"), (object)array("name" => "Jane", "hobby" => "dancing") ); echo "Person 1 Name: ".$testArray[0]->name; echo "Person 2 Hobby: ".$testArray[1]->hobby;


Como otros han notado, no hay un objeto literal en PHP, pero puedes "falsearlo" al lanzar una matriz a un objeto.

Con PHP 5.4, esto es aún más conciso, porque las matrices se pueden declarar con corchetes . Por ejemplo:

$obj = (object)[ "foo" => "bar", "bar" => "foo", ];

Esto le daría un objeto con propiedades "foo" y "bar". Sin embargo, no creo que esto realmente proporcione mucha ventaja sobre el uso de matrices asociativas. Es solo una diferencia de sintaxis.

Considere abrazar la singularidad y el "sabor" de todos los idiomas que usa. En JavaScript, los literales de objeto están por todos lados. En PHP, los arrays asociativos son funcionalmente los mismos que los literales de objetos de JavaScript, son fáciles de crear y otros programadores de PHP entienden bien. Creo que es mejor que aceptes este "sabor" que tratar de hacer que se sienta como la sintaxis literal del objeto de JavaScript.


En PHP, debe crear una instancia antes de poder usar una clase. Por supuesto, puedes poner las instancias en una matriz más adelante.


Mi manera de los literales de objetos estilo JavaScript en PHP es la siguiente:

Primero creo una matriz asociativa como esta:

$test = array( ''name'' => "test", ''exists'' => true );

Entonces fácilmente lo hago un objeto como este:

$test = (object)$test;

Ahora puedes probarlo:

echo gettype($test); // "object" echo $test->name; // "test"



Si el json_decode(json_encode( $array )) no es bueno para usted, entonces puede usar algunas funciones similares como estas. Cuál es más rápido, no sé.

function deep_cast_object( $o ){ return deep_cast_object_ref( $o ); } function deep_cast_object_ref( & $o ){ if( is_array( $o )) $o = (object)$o; if( is_object( $o )) foreach( $o as & $v ) deep_cast_object_ref( $v ); return $o; } $obj = deep_cast_object(array( ''Fractal'' => array( ''of'' => array( ''bad'' => ''design'', ), ), )); var_dump( $obj );


Si quiere definir módulos en el patrón literal del objeto "como JavaScript", podría hacer algo como esto:

$object = (object) [ ''config'' => (object) [ ''username'' => ''Rob Bennet'', ''email'' => ''[email protected]'' ], ''hello'' => function() use(&$object) { return "Hello " . $object->config->username . ". "; }, ''emailDisplay'' => function() use(&$object) { return "Your email address is " . $object->config->email; }, ''init'' => function($options) use(&$object) { $object->config = $options; $doUsername = $object->hello; $doEmail = $object->emailDisplay; return $doUsername() . $doEmail(); } ]; $sayMyInfo = $object->init; echo $sayMyInfo((object) [ ''username'' => ''Logan'', ''email'' => ''[email protected]'' ]);

En este tipo de escenario modular, generalmente opto por el patrón de fachada , solo me gusta escribir mis llamadas de esta manera:

Module::action()->item;

o

Post::get()->title;

Ninguno de estos patrones hace que sea fácil (o incluso posible a veces) para las pruebas. Pero esto es solo una prueba de concepto. Técnicamente, "no" no hay Object Literal en PHP, pero si estás acostumbrado a la sintaxis de JavaScript (que soy más que PHP), puedes fingir y hacer esto. Como puede ver, es mucho más complicado en PHP que en JavaScript.