con una nueva matriz hago esto:
$aVal = array();
$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";
¿Existe una sintaxis similar para un objeto?
(object)$oVal = "";
$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
$var = (object) (boolean) (string) (int) (array) new StdClass;
Ya sabes, solo para estar a salvo.Arrays - How to define an empty object in PHP
. No tiene nada que ver con las matricesRespuestas:
Un comentario en el manual lo resume mejor:
fuente
stdClass
en mi cabeza como "clase estándar"new \stdClass();
PHP Namespace DocstdClass()
la palabraAIDS
?La forma estándar de crear un objeto "vacío" es:
Pero, con PHP> = 5.4, personalmente prefiero usar:
Es más corto y personalmente lo considero más claro porque stdClass podría ser engañoso para los programadores novatos (es decir, "¡Hola, quiero un objeto, no una clase!" ...).
Lo mismo con PHP <5.4 es:
(object)[]
es equivalente anew stdClass()
.Vea el manual de PHP ( aquí ):
y ( aquí ):
Sin embargo, recuerde que vacío ($ oVal) devuelve falso , como @PaulP dijo:
Con respecto a su ejemplo, si escribe:
PHP crea la siguiente Advertencia, creando implícitamente la propiedad
key1
(un objeto en sí mismo)Esto podría ser un problema si su configuración (consulte el nivel de informe de errores ) muestra esta advertencia al navegador. Este es otro tema completo, pero un enfoque rápido y sucio podría estar utilizando el operador de control de errores (@) para ignorar la advertencia:
fuente
stdClass
hace.stdClass
hace. UtilicéstdClass
el código que responde a la pregunta. Lo siento, pero no estoy creando un nuevo problema, esa fue mi opinión personal (como escribí).(object) []
Quiero señalar que en PHP no existe el objeto vacío en sentido:
pero por supuesto $ obj estará vacío.
Por otro lado, la matriz vacía significa vacío en ambos casos
Cita de la función de registro de cambios vacía
fuente
php.net dijo que es mejor:
fuente
Me encanta lo fácil que es crear objetos de tipo anónimo en JavaScript:
Así que siempre trato de escribir este tipo de objetos en PHP como lo hace javascript :
Pero como esto es básicamente una matriz, no puede hacer cosas como asignar funciones anónimas a una propiedad como lo hace js:
Bueno, puedes hacerlo, pero IMO no es práctico / limpio:
Además, al usar este Synthax puedes encontrar algunas sorpresas divertidas , pero funciona bien en la mayoría de los casos.
fuente
Además de la respuesta de zombat si sigues olvidando
stdClass
Ahora puedes hacer:
fuente
Puede usar
new stdClass()
(que se recomienda):O puede convertir una matriz vacía en un objeto que produce una nueva instancia vacía de la clase incorporada stdClass:
O puede convertir el
null
valor en un objeto que produzca una nueva instancia vacía de la clase incorporada stdClass:fuente
para acceder a los datos en una clase estándar de la misma manera que lo hace con una matriz asociativa, simplemente use la sintaxis {$ var}.
fuente
Como otros han señalado, puede usar stdClass. Sin embargo, creo que es más limpio sin el (), así:
Sin embargo, según la pregunta, parece que lo que realmente desea es poder agregar propiedades a un objeto sobre la marcha. No necesita usar stdClass para eso, aunque puede hacerlo. Realmente puedes usar cualquier clase. Simplemente cree una instancia de objeto de cualquier clase y comience a configurar las propiedades. Me gusta crear mi propia clase cuyo nombre es simplemente o con alguna funcionalidad extendida básica que me gusta usar en estos casos y es agradable para extender desde otras clases. Básicamente es mi propia clase de objeto base. También me gusta tener una función simplemente llamada o (). Al igual que:
Si no le gusta tener su propio tipo de objeto base, simplemente puede hacer que o () devuelva una nueva stdClass. Una ventaja es que o es más fácil de recordar que stdClass y es más corto, independientemente de si lo usa como nombre de clase, nombre de función o ambos. Incluso si no tiene ningún código dentro de su clase o, aún es más fácil de memorizar que stdClass (que puede invocar la idea de una 'clase de enfermedad de transmisión sexual'). Si personaliza la clase o, puede encontrar un uso para la función o () en lugar de la sintaxis del constructor. Es una función normal que devuelve un valor, que es menos limitado que un constructor. Por ejemplo, un nombre de función se puede pasar como una cadena a una función que acepta un parámetro invocable. Una función también admite el encadenamiento. Entonces puedes hacer algo como:
Este es un gran comienzo para un "lenguaje" base para construir otras capas de lenguaje sobre las cuales la capa superior se escribe en DSL internos completos. Esto es similar al estilo de desarrollo lisp, y PHP lo admite mucho mejor de lo que la mayoría de la gente piensa. Me doy cuenta de que esto es un poco tangente a la pregunta, pero la pregunta toca lo que creo que es la base para utilizar completamente el poder de PHP.
fuente
Si desea crear un objeto (como en javascript) con propiedades dinámicas, sin recibir una advertencia de propiedad indefinida.
fuente
Puedes probar de esta manera también.
Salida:
fuente
Use un objeto genérico y asigne pares de valores clave.
O lanzar una matriz en un objeto
fuente
Si no quieres hacer esto:
Puede usar uno de los siguientes:
PHP> = 5.4
PHP <5.4
fuente
Aquí un ejemplo con la iteración:
fuente
Tienes esta técnica mala pero útil:
fuente
stdClass es el objeto PHP predeterminado. stdClass no tiene propiedades, métodos o padre. No es compatible con métodos mágicos y no implementa interfaces.
Cuando lanza un escalar o matriz como Objeto, obtiene una instancia de stdClass. Puede usar stdClass siempre que necesite una instancia de objeto genérico.
¡stdClass NO es una clase base! Las clases de PHP no se heredan automáticamente de ninguna clase. Todas las clases son independientes, a menos que extiendan explícitamente otra clase. PHP difiere de muchos lenguajes orientados a objetos a este respecto.
No puede definir una clase llamada 'stdClass' en su código. Ese nombre ya lo usa el sistema. Puede definir una clase llamada 'Objeto'.
Podría definir una clase que extienda stdClass, pero no obtendría ningún beneficio, ya que stdClass no hace nada.
(probado en PHP 5.2.8)
fuente