¿Por qué no usar arrays en PHP?

Los arrays son una de las estructuras de datos más usadas en PHP. Son comodísimos, fáciles de usar y hasta quedan bonitos en el código… pero pueden ser algo infernal.

¿Estás diciendo que nunca debería usar un array?

Nop, no estoy diciendo tal cosa. Me parecen una herramienta muy buena. Lo que sí me estoy quejando es de su constante abuso. Por ejemplo, para una lista de elementos del mismo tipo me parece genial un array: una lista de números, de emails, de objetos, etc.

No tenemos información sobre su estructura

Lo que me «molesta» de un un array es que no sabemos a priori nada de su estructura. En un array cabe «cualquier cosa».

Cuando una función o un objeto nos devuelve un array no tenemos ni idea de qué «campos» tiene o deja de tener. Sabemos que nos llega un array, pero lo que éste trae es un absoluto misterio.

No puedes controlar si tienen el formato correcto al pasarlos a un método o clase

Puedes pensar «¿y qué me importa que no tenga formato correcto?». Pues veamos un ejemplo a ver qué te parece.

Después de romperte mucho la cabeza llegas a este potente algoritmo para saludar a una persona:

function hola($persona)
{
    echo "Hola " . $persona['nombre'] . " " . $persona['apellido'] . "\n";
}

$persona = [
    'nombre' => 'Gorka',
    'apellido' => 'Urrutia',
];

hola($persona);

Esto funciona a las mil maravillas ¡Todo correcto! Peeero, resulta que en una de las llamadas que haces a esa función se te olvida el apellido:

$persona = [
    'nombre' => 'Gorka',
];

hola($persona);

¡Oh, no! Un error. Pero, pensarás, no pasa nada. Siempre tengo cuidado y ésto no me pasa nunca. Yo jamás olvidaría un elemento de un array. Y entonces vas y haces ésto:

$persona = [
    'nombre' => 'Gorka',
    'apelido' => 'Urrutia',
];

hola($persona);

Hay un error ¿lo has visto? ¡Pone apelido en lugar de apellido!

Venga, pues mete unos isset() o el operador ‘??’ para solucionarlo:

function hola($persona)
{
    if(!isset($persona['nombre'])) {
        throw new Exception('Falta el nombre!');
    }
    if(!isset($persona['apellido'])) {
        throw new Exception('Falta el apellido!');
    }
    echo "Hola " . $persona['nombre'] . " " . $persona['apellido'] . "\n";
}

¡Buah! Esto está cogiendo una mala pinta tremenda. Tiene que haber otra opción.

¿Y si indico el tipo de dato?

Pues mira, como PHP ahora nos permite indicar el tipo de dato igual va y se te ocurre añadir «array» para indicar el tipo de dato:

function hola(array $persona)
{
    echo "Hola " . $persona['nombre'] . " " . $persona['apellido'] . "\n";
}

Pues no, eso no te va a ayudar en nada como habrás imaginado. Solo puedes indicar que la función necesita un array pero ahí acaba la cosa.

¿Y por qué no usar un objeto?

¡Eh! ¡Esa sí es una buena idea! Vamos a probar:

class Persona
{
    public $nombre;
    public $apellido;

    public function __construct($nombre, $apellido)
    {
        $this->nombre = $nombre;
        $this->apellido = $apellido;
    }
}

function hola(Persona $persona)
{
    echo "Hola " . $persona->nombre . " " . $persona->apellido . "\n";
}

$persona = new Persona('Gorka', 'Urrutia');

hola($persona);

¡Bah! – pensarás – pero eso de usar un objeto es un rollo y es más código que un array.

Cierto, son más líneas de código. Pero tiene una serie de ventajas:

  • Cuando recibes un objeto Persona sabes cuál es su estructura y no tienes que andar validándola cada vez.
  • Nunca te faltarán campos y no cometerás errores al escribir el código.
  • Tu editor de código será capaz de reconocerlo y te ayudará a la hora de teclear.
  • Puedes presumir diciendo que usas objetos.

Ya ¿pero qué pasa con la encapsulación y esas historias? Pues no pasa nada, puedes añadir más validaciones, getters y setters, etc. Pero creo que ya se ve la idea ¿no?

Los arrays consumen más memoria que las clases

Otra punto en contra de los arrays es que usan más memoria que los objetos. Aquí el señor Crell ha hecho un sesudo estudio para ver si ocupa más memoria un objeto o un array.

De todos modos, salvo que tengas arrays con cientos o miles de líneas no vas a notar mucha diferencia.

Deja un comentario