PHP es un lenguaje de paradigma mixto, que permite usar y devolver tipos de datos que no son objetos, como las matrices. Planteo una pregunta para tratar de aclarar algunas pautas para la selección de matrices frente a objetos al decidir qué construcción de programación usar en una situación particular.
Esta es realmente una pregunta sobre las formas de codificar datos usando construcciones de lenguaje PHP y cuándo una forma es más probable que se elija sobre otra para fines de paso de datos (es decir, Arquitectura Orientada a Servicios o servicios web).
Ejemplo
Supongamos que tiene un tipo de elemento que consiste en {costo, nombre, número de parte, número de elemento}. Su programa requiere la visualización de varios de estos tipos de elementos, donde decide utilizar una matriz como contenedor externo para contener cada uno de los tipos de elementos. [También puede usar PHP ArrayObject
para el paradigma OO, pero mi pregunta no es sobre esa matriz (externa)]. Mi pregunta es sobre cómo codificar los datos de tipo de elemento y sobre qué paradigma usar. PHP te permite usar PHP Native Arrays
o PHP Objects
.
Puedo codificar tales datos, de dos maneras aquí, así:
//PHP's associative arrays:
$ret = array(
0 => array(
'cost' => 10.00,
'name' => 'item1',
'part_number' => 'zyz-100',
'item_count' => 15
),
1 => array(
'cost' => 34.00,
'name' => 'item2',
'part_number' => 'abc-230',
'item_count' => 42
),
);
vs
//here ItemType is encapsulated into an object
$ret = array(
0 => new ItemType(10.00, 'item1', 'zyz-100', 15),
1 => new ItemType(34.00, 'item2', 'abc-230', 42),
);
class ItemType
{
private $price;
private $name;
private $partNumber;
private $itemCount;
function __construct($price, $name, $partNumber, $itemCount) {..}
}
Lo que estoy pensando
La codificación de matriz es liviana y está más lista para JSON, pero puede ser más fácil de estropear. Escribe mal una de las claves de la matriz asociativa y es posible que tengas un error que sea más difícil de detectar. Pero también es más fácil cambiar por capricho. Digamos que no quiero almacenar item_count
más, puedo usar cualquier software de procesamiento de texto para eliminar fácilmente todas las item_count
instancias en la matriz y luego actualizar otras funciones que lo usan en consecuencia. Puede ser un proceso más tedioso, pero es simple.
La codificación orientada a objetos recurre a las instalaciones de lenguaje IDE y PHP y hace que sea más fácil detectar cualquier error de antemano, pero es más difícil de programar y codificar en primer lugar. Digo más, porque tienes que pensar un poco sobre tus objetos, pensar con anticipación, y la codificación OO requiere una carga cognitiva un poco más alta que escribir estructuras de matriz. Dicho esto, una vez que está codificado, algunos cambios pueden ser más fáciles de implementar, en cierto sentido, que eliminar item_count
, por ejemplo, requerirá cambiar menos líneas de código. Pero los cambios en sí mismos aún pueden requerir una mayor carga cognitiva en comparación con el método de matriz, ya que están involucradas las instalaciones de OO de nivel superior.
Pregunta
En algunos casos está claro, como los casos en los que tendré que realizar manipulaciones en los datos. Pero en algunos casos, donde solo necesito almacenar unas pocas líneas de datos de "Tipo de elemento", no tengo pautas o consideraciones claras en las que apoyarme cuando intento decidir si usar matrices o si construir objetos. Parece que puedo lanzar una moneda y elegir una. ¿Es ese el caso aquí?
array
, 2: User-defined Class
, 3: stdClass
. El rendimiento en términos de velocidad es más o menos el mismo cuando se compara array
y a User-defined class
(como su ItemType
), pero los class
es definidos tienden a usar menos memoria que los array
s. stdClass
Por otro lado, es la más lenta de las tres opciones y también utiliza la mayor cantidad de memoria.
(object)['foo'=>'bar']
. El valor resultante tiene claseStdClass
, estará codificado en JSON en su totalidad porjson_encode()
y las propiedades se pueden renombrar tan fácilmente como índices de matriz (que no siempre es tan fácil, cuando se accede indirectamente a través de una variable). Sin embargo, hay diferentes operaciones en tales valores; por ejemplo, no tiene uniones de objetos ya que tiene uniones de matriz, y no puede usar directamente lasarray_*()
funciones.