Estas últimas semanas, varios miembros del equipo nos estamos preparando para la certificación de Zend PHP 5.3. Durante estas largas horas de repaso y estudio, hemos encontrado algunas curiosidades o rarezas que nos han llamado la atención.

En primer lugar, un dato curioso es el origen recursivo del acrónimo PHP (PHP HyperText Pre-processor), aunque originalmente las siglas significaban Personal Home Page Tools.

Nombres de funciones

Y ahora, veamos algunas funciones. Lo primero que nos sorprendió es que algunas de ellas llevan guión bajo, otras no… no parecen llevar un patrón común, lo cual lo hace complicado a la hora de memorizarlas. La primera reacción fue poner cara de algún meme de estos que circulan por la red.

Ejemplos de funciones de strings, sin guión bajo:

Ejemplos con guión bajo:

Este otro caso tambien es curioso: tempnam vs tmpfile. En una usa el prefijo tmp y en la otra temp.

Y para denotar insensibilidad a mayúsculas/minúsculas: stripos (usa una i para denotar case-insensive), pero luego nos encontramos con strcasecmp (en este caso introduce case).

‘Count’ de strings

Y siguiendo con strings, cabe mencionar que podemos acceder a caracteres de una cadena mediante el acceso a la posición tipo Array. Por ejemplo:

<?php 
$cadena = 'Hola emagister!'; 
echo $cadena[5]; // Imprime 'e' 

Recordemos que la longitud de un array se calcula mediante strlen, pero si es permitido el acceso en formato array, que sucedería si utilizamos el método count de arrays? Lo primero que nos pasaría por la cabeza es que devuelve el tamaño del array:

<?php 
echo count($cadena); // Imprime 1! 

Efectivamente, el resultado del tamaño del “array” es 1, pese a que podamos acceder a los caracteres individualmente. Bueno, su explicación en la documentación es que si el parámetro a la función no es un Array o bien un objeto que implemente la interfaz Countable, el resultado retornado será 1, a no ser que la variable no esté seteada, para el cual el valor será 0.

isset vs is_null vs empty

Otro caso curioso es la función isset, la cual comprueba si una variable pasada por parámetro está definida. Dicho método accepta tantos parámetros como variables queramos comprobar.

bool isset ( mixed $var [, mixed $... ] )

lo cual es muy útil para no anidar llamadas a esta función en un condicional. Sería de esperar que los métodos is_null o empty, los cuales hacen comprobaciones similares (null para el primer caso y null, vacío, false o 0… entre otros para el segundo) actuaran del mismo modo, sin embargo estos sólo aceptan un parámetro. ¡Lo útil que nos resultaria en algunos casos!

Usos de goto

El operador goto se introduce en la versión 5.3 de PHP. La verdad es que casi todo el mundo aprendemos bien pronto que es una práctica desaconsejada, debido a que en cierta manera rompe con la secuencialidad del código, y puede hacer más compleja la legibilidad de la aplicación. Entonces, ¿porqué se introdujo en la versión 5.3? Bien, pues Rasmus Lerdorf, creador de PHP, mencionó en la PHPConference 2011 de Barcelona que tiene todo el sentido su existencia (aparte de llamarnos idiotas a los que pensábamos lo contrario, casi todo el aforo de la sala :-P ).

Por ejemplo, es bastante más inteligible usarlo para salir de un bucle que utilizar el propio break. Sobretodo cuando la salida es a través de varios bucles anidados (cuando podríamos usar break n). Tomando el ejemplo del Manual de PHP:

<?php 
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    if($j==17) goto end;
  }  
}
echo "i = $i";
end:
echo 'j alcanzó 17';

¿Un paradigma roto :-) ?

El operador and no es &

La verdad es que PHP es un lenguaje sencillo de aprender, y al ser poco tipado, es algo común comenzar a utilizarlo sin apenas consultar su documentación. En algun caso puedes llegar a pensar que tanto el operador and puede ser un alias de &. Pero nada más lejos de la realidad, son operadores con significados distindos, y con una precedencia diferente que puede causar algun quebradero de cabeza.

<?php 
$var1 = true;
$var2 = false;

$result = $var1 & $var2;
var_dump($result); // Imprime bool(false)

$result = $var1 and $var2;
var_dump($result); // Imprime bool(true)

En el segundo caso, el operador de asignación = tiene precedencia respecto al operador lógico ‘and’. Entonces primero de todo se realiza la asignación y ese es el valor que guarda la variable $result. En cambio, en el primer caso, el operador ‘&’ tiene precedencia respecto al operador = y por ello primero se realiza la operación de bit a bit y luego se asigna el resultado a la variable.

¡Es por estos detalles que vale tanto la pena leer el Manual de PHP!

 

3 Comments

 

  1. 29/11/2011  4:44 PM by Sergio Reply

    Muy buen artículo. Yo también me vuelvo loco con esos cambios de criterios con los nombres. Solo un comentario: cambia lo de "entendedor", que duele un poco. La palabra adecuada sería inteligible.

    • 29/11/2011  4:55 PM by Oriol González Reply

      Gracias Sergio! toda la razón, lo cambié, aunque a buen entendedor… :-)

  2. 26/02/2012  11:28 PM by Enrique Place Reply

    Es una de las características de PHP, el desorden y poco criterio del lenguaje, que espero que con los años se solucione. No puede ser que no exista un estándar oficial de codificación (en lo personal recomiendo Zend, uses el framework o no), pero viendo el código cómo está estructurado, ellos mismos no tienen uno claro. Mi sugerencia es que a futuro centralicen todo en "clases base", como en Java (todas las funciones relacionadas con cadenas deberían estar dentro de la clase String, etc).

    Con respecto a Rasmus y sus comentarios, la verdad que en lo personal no creo que sea un buen desarrollador (no es la primera vez que dice estas tonterías), sí mantengo el reconocimiento de la creación de PHP, pero no es para nada alguien para seguir (es más, es muy opuesto al uso de POO y hasta de frameworks, y casi no apoya a Zend).

    Pero bueno, suerte que PHP no depende de él para evolucionar.

    PD: lo del goto es una tontería, piensa que por ser una celebridad histórica puede decir lo que que quiera, pero nosotros tenemos que ser lo suficientemente objetivos y seguros como para darnos cuenta que las tonterías las pueden decir todos, sin importar tu popularidad).

    Saludos! ;-)

Leave a reply

 

Your email address will not be published.