10 cosas que probablemente no sabías de PHP

Posted by

Hace un año empecé a buscar alternativas para desarrollar web, ya que el PHP que habia estado usando por años se quedó atorado en el pasado… estuve revisando bastante Django y Rails, que son excelentes frameworks, en modernos lenguajes.

Entonces fui invitado a enseñar PHP en un instituto local, lo que me obligó a releer su documentación (te das cuenta lo poco que sabes de algo, cuando lo enseñas…). Y me di con la sorpresa que desde la versión 5.4, PHP está menos feo 🙂 Y desde entonces han estado añadiendo características interesantes, aunque no lo ponen a la par con los otros lenguajes, al menos ahora no está tan atrasado como en versiones pasadas.

Pero veo que muchos no se han percatado de algunos cambios. Así aquí presento mi top-ten de las cosas de PHP que probablemente no sabías que existían:

El tag de cerrar el código PHP es innecesario

Si tu fichero .php tiene puro código PHP, es mejor no colocar el tag ?> al final. Esto evita que se introduzcan líneas en blanco en el HTML, que lo personal me ha dado varios dolores de cabeza cuando uso la función header(), por ejemplo.

Variables y funciones en castellano

PHP soporta los caracteres ASCII extendidos para los nombres de variables y funciones. Esto es medio limitante para otros idiomas, pero para el español es suficiente, ya que incluye todas las vocales acentuadas, la eñe, y la cedilla, en mayúsculas y minúsculas.

<?php
function añadir_acción($acción) {
    return "Acción $acción añadida";
}

$AÑO = 1991;
echo "Año $AÑO: " . añadir_acción('correr') . PHP_EOL;

Tag corto para plantillas ( >= 5.4 )

Para imprimir una variable dentro de un HTML, puedes usar el tag <?=... como reemplazo al <?php echo ..., que hace tu HTML un poco más limpio, y ya no requerirás usar algún motor de plantillas.

<h1>Información de usuario <?=$usuario?></h1>
<p>Nombre completo: <?=$nombre_completo?></p>

Antes de la versión 5.4, esta versión del tag estaba unido al “tag corto” que cayó en desuso, por lo que por defecto estaba desactivada.

include() y require() pueden devolver un valor

Esto también aplica para include_once() y require_once(). El código incluido puede retornar un valor (o finalizar anticipadamente su ejecución) usando la sentencia return. Me parece útil para ficheros de configuración. E.g. este fichero llamado configuracion.php

<?php return [
    'base_datos' => [
        'tipo' => 'mysql',
        'usuario' => 'root',
        'contraseña' => 'pikachu123',
        'basedatos' => 'historias',
    ],
];

Y luego, en otro fichero:

<?php
    $configuración = include 'configuracion.php';

Forma alterna de estructuras de control para plantillas

Las estructuras de control if, while, for, foreach, y switch tienen una sintaxis alternativa, que puede ser útil al momento de hacer plantillas HTML: El bloque se inicia con un “:”, y se acaba con endif, endwhile, endfor, endforeach, y endswitch, respectivamente. Confunde menos que las llaves cuando se mezcla con HTML.

<table>
<?php foreach ($datos as $d): ?>
<tr>
<td><?=$d['nombres']?></td>
<td><?=$d['apellidos']?></td>
</tr>
<?php endforeach ?>
</table>

 Arrays con corchetes ( >= 5.4 )

Esto fue lo primero que me llamó la atención. Adiós a la horrible función array() para crearlos, que se ve horrible al crear arrays anidados. Ahora los arrays se ven elegantes, como en otros lenguajes:

$a = [1, 2, 3];

Cabe acotar que puedes acceder los elementos de array usando corchetes, y también usando llaves. Asi que para imprimir el 2do elemento, puedes hacer un echo $a{1}; , y es válido.

Desreferenciación de arrays y strings retornados desde funciones ( >= 5.4 )

Bonita palabra, “desreferenciación” 😛 Ahora puedes acceder directo a los elementos de un array (o a los caracteres de un string) directo desde la llamada de la función. E.g.:

<?php

function retorna_array () {
    return ['pera', 'manzana', 'plátano'];
}

function retorna_string () {
    return 'parangaricutirimicuaro';
}

echo retorna_array()[2] . PHP_EOL; // Imprime 'platano'
echo retorna_string()[10] . PHP_EOL; // Imprime 'u'

Antes de esto, tenías que guardar en una variable el resultado de la función, para acceder a sus elementos.

Como bonus, a partir de la versión 5.5, puedes también desreferenciar arrays y strings literales, aunque aun no le encuentro una utilidad. E.g.

<?php
// Imprime 'llorones'
echo ['papanatas', 'llorones', 'baratijas', 'pellizco'][1];

Encadenamiento de métodos ( >= 5.0 )

Esto también era uno de los atrasos de PHP, los objetos eran devuelto como valor, y no como referencia. Ahora si son referencias, por lo que puedes retornar el mismo objeto desde un método, y hacer cosas guapas como:

$usuarios = users::find()
   -> where(['admin' => True])
   -> order('name')
   -> limit(10)
   -> getarray('login', 'name');

Es una sola instrucción, dividida en varias líneas por legibilidad. Cada método no estático (excepto el último) tiene un return $this; al final. Este snippet de código es parte de mi framework M3, que ya lo estaré comentando después 😉

Namespaces ( >= 5.3)

Los namespaces son una forma de agrupar constantes, funciones y clases bajo un nombre. Es una forma medio elegante de crear una librerías: En vez de tener una función como mensajes_error(), puedes tener en un fichero, digamos, mensajes.php:

<?php

namespace mensajes;

function error( $msg ) {
    echo "ERROR: $msg" . PHP_EOL;
}

Y luego, en otro fichero, incluyes la librería:

<?php

require 'mensajes.php';

mensajes\error ( 'Todo ha fallado!' );

 

Iteración de resultado de una consulta en MySQLi ( >= 5.4 )

En vez de hace un while ($data = $result -> fetch_assoc()), puedes iterar el resultado con un foreach, como si se tratara de un array. Se ve un poco más elegante:

<?php

$db = new MySQLi('localhost', 'root', '', 'mibasededatos');

$result = $db -> query ( 'SELECT * FROM clientes' );

foreach ( $result as $r ) {
    echo $r['nombres'] . PHP_EOL;
}

¿Faltó algo nuevo de PHP? ¡Házmelo saber en los comentarios!

One comment

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *