que - ¿Cuándo debería usar stdClass y cuándo debería usar una matriz en php oo?
recorrer stdclass object php (7)
Bueno, hay 3 diferencias:
- ellos tienen una identidad por lo que el valor predeterminado para pasar argumentos de matriz es llamar por valor y para objetos llamar compartiendo .
- hay una diferencia semántica Si usa un objeto, cualquiera que lea el código entiende que el valor representa el modelo de algún tipo de entidad, mientras que una matriz se supone que actúa como una colección o un mapa
- Y por último pero no menos importante, la refacturación se vuelve significativamente más fácil. Si desea utilizar una clase concreta en lugar de stdClass, todo lo que tiene que hacer es crear una instancia de otra clase. Lo cual también le permite agregar métodos.
greetz
back2dos
En medio de un período de grandes refactorizaciones en el trabajo, deseo presentar stdClass ***** como una forma de devolver los datos de las funciones y estoy tratando de encontrar argumentos no subjetivos para respaldar mi decisión.
¿Hay alguna situación en la que sería mejor usar una en lugar de la otra?
¿Qué beneficios obtendré al usar stdClass en lugar de matrices?
Algunos dirían que las funciones tienen que ser tan pequeñas y específicas para poder devolver un solo valor. Mi decisión de usar stdClass es temporal, ya que espero encontrar los objetos de valor correctos para cada proceso en el largo plazo.
El único voto de confianza OBJETIVO que puedo encontrar es:
json_decode
usa stdClass por defecto, por lo que los mortales en userland deberían usar stdClass para situaciones similares.
El enfoque habitual es
Use objetos al devolver una estructura de datos definida con ramas fijas:
$person -> name = "John" -> surname = "Miller" -> address = "123 Fake St"
Usa matrices al devolver una lista:
"John Miller" "Peter Miller" "Josh Swanson" "Harry Miller"
Utilice una matriz de objetos al devolver una lista de información estructurada:
$person[0] -> name = "John" -> surname = "Miller" -> address = "123 Fake St" $person[1] -> name = "Peter" -> surname = "Miller" -> address = "345 High St"
Los objetos no son adecuados para mantener listas de datos, porque siempre necesita una clave para abordarlos. Las matrices pueden cumplir ambas funciones: mantener listas arbitrarias y una estructura de datos.
Por lo tanto, puede usar matrices asociativas sobre objetos para el primer y tercer ejemplo, si así lo desea. Diría que es solo una cuestión de estilo y preferencia.
@Deceze hace una serie de buenos puntos sobre cuándo usar un objeto (Validación, verificación de tipo y métodos futuros).
En las pruebas de array vs stdclass, la forma en que php maneja las propiedades dinámicas es más lenta que las matrices asociativas. No digo esto para argumentar la micro optimización, sino que si va a hacer esto, será mejor que defina una clase de datos sin métodos y establezca propiedades públicas. Esp si estás usando php 5.4+. Bajo el capó, las propiedades definidas se asignan directamente a la matriz de ca sin hashtable donde las dinámicas necesitan usar una tabla hash.
Esto tiene la ventaja adicional de convertirse más adelante en una clase completa sin necesidad de volver a trabajar en la interfaz.
Encuentro los objetos stdClass sobre las matrices útiles cuando necesito mantener mi código limpio y legible de alguna manera. Tomemos como ejemplo la función getProperties()
que devuelve un conjunto de propiedades, por ejemplo, datos sobre una persona (nombre, edad, sexo). Si getProperties()
devuelve una matriz asociativa, cuando quiera usar una de las propiedades devueltas, debería escribir dos instrucciones:
$data = getProperties();
echo $data[''name''];
Por otro lado, si getProperties()
devuelve un stdClass, puede escribirlo en una sola instrucción:
echo getProperties()->name;
No creo que haya ninguna ventaja razonable de utilizar un stdClass en un array, siempre que tu única intención sea devolver múltiples tipos de datos arbitrarios de una llamada a función .
Como técnicamente no puede devolver múltiples valores de forma nativa, debe usar un contenedor que pueda contener todos los demás tipos de datos disponibles en PHP. Eso sería un objeto o una matriz.
function fn1() { return array(1,2); }
function fn2() { return array(''one'' => 1, ''two'' => 2); }
function fn3() { return (object) array(1,2); }
function fn4() { return (object) array(''one'' => 1, ''two'' => 2); }
Todo lo anterior funcionaría. La matriz es una pequeña fracción insignificante más rápida y menos trabajo de tipeo. También tiene un propósito claramente definido en contraste con el stdClass genérico (que es un poco desagradable, ¿verdad?). Ambos solo tienen una interfaz implícita, por lo que tendrás que mirar los documentos o el cuerpo de la función para saber qué contendrán.
Si desea usar objetos a cualquier costo, podría usar ArrayObject o SplFixedArray , pero si mira sus API, ¿diría que necesita su funcionalidad para la simple tarea de devolver valores múltiples aleatorios? No lo creo. Sin embargo, no me malinterprete: si quiere usar stdClass, entonces úselo. No es como si rompiera cualquier cosa. Pero tampoco ganarías nada. Para agregar al menos algún beneficio, puede crear una clase separada denominada ReturnValues para esto.
Podría ser una simple clase de etiquetado
class ReturnValues {}
o algo más funcional
class ReturnValues implements Countable
{
protected $values;
public function __construct() { $this->values = func_get_args(); }
public function __get($key) return $this->values[$key]; }
public function count() { return count($this->values); }
}
Por supuesto, no hace mucho y obtener los valores de esto todavía se hace a través de una interfaz de implícita, pero al menos la clase tiene ahora una responsabilidad más claramente definida. Puedes extender desde esta clase para crear objetos ReturnValue para operaciones particulares y darles una interfaz explícita:
class FooReturnValues extends ReturnValues
{
public function getFoo() { return $this->values[''foo'']; }
public function getBar() { return $this->values[''foo'']; }
}
Ahora el desarrollador solo tiene que mirar la API para saber qué valores múltiples devolverá foo (). Por supuesto, tener que escribir clases concretas de ReturnValue para cada operación que pueda devolver múltiples valores puede volverse tedioso rápidamente. Y personalmente, creo que esto se inventó para el propósito inicial.
De todos modos, espero que tenga sentido.
Usar stdClass
para cumplir la misma función que una matriz no es muy útil en mi humilde opinión, simplemente agrega la sobrecarga de un objeto sin ningún beneficio real. También se está perdiendo muchas funciones de matriz útiles (por ejemplo, array_intersect
). Al menos debe crear su propia clase para habilitar la comprobación de tipos o agregar métodos al objeto para que valga la pena usar un objeto.