Las nuevas funciones de PHP 5.5

23 de junio de 2013

Nuevas funciones del núcleo de PHP

Una de las nuevas funciones más útiles añadidas por PHP 5.5 es array_column(), que extrae todos los valores de una determinada columna del array multidimensional indicado.

Si utilizas por ejemplo PDO para obtener registros de una base de datos, aunque sólo quieras obtener una columna, el resultado siempre es un array multidimensional:

$resultado = array(
    array('nombre' => 'Usuario 1'),
    array('nombre' => 'Usuario 54'),
    array('nombre' => 'Usuario 231'),
    array('nombre' => 'Usuario 4'),
    // ...
);

Gracias a la nueva función array_column(), resulta muy sencillo aplanar ese array para quedarse solamente con la columna nombre:

$nombres = array_column($resultado, 'nombre');

La función array_column() solamente permite extraer una columna cada vez, pero admite un tercer parámetro opcional que indica la columna cuyos valores se utilizan como claves del nuevo array. Imagina que el array del ejemplo anterior tuviera más columnas de información:

$resultado = array(
    array(
        'id'     => 1,
        'nombre' => 'Usuario 1',
        'edad'   => '...',
    ),
    array(
        'id'     => 54,
        'nombre' => 'Usuario 54',
        'edad'   => '...',
    ),
    array(
        'id'     => 231,
        'nombre' => 'Usuario 231',
        'edad'   => '...',
    ),
    array(
        'id'     => 4,
        'nombre' => 'Usuario 4',
        'edad'   => '...',
    )
);

$nombres = array_column($resultado, 'nombre');
$nombresOrdenadosPorId = array_column($resultado, 'nombre', 'id');

El resultado de ejecutar el código anterior sería:

$nombres = array(
    0 => 'Usuario 1',
    1 => 'Usuario 54',
    2 => 'Usuario 231',
    3 => 'Usuario 4',
    // ...
);

$nombresOrdenadosPorId = array(
    1   => 'Usuario 1',
    54  => 'Usuario 54',
    231 => 'Usuario 231',
    4   => 'Usuario 4',
    // ...
);

Los valores de la columna que se utiliza como clave no tienen que ser necesariamente numéricos. Si los valores son cadenas de texto, la diferencia será que el array resultante es asociativo en vez de numérico.

La nueva función json_last_error_msg() devuelve el último mensaje de error producido al ejecutar la función json_encode() o json_decode(). Si no se ha producido ningún error, devuelve null.

Las versiones anteriores de PHP incluyen varias funciones para convertir una variable a un tipo determinado: intval(), floatval() y strval(). Ahora PHP 5.5 añade la función que faltaba: boolval(), que convierte cualquier variable en un valor booleano:

boolval(0);             // false
boolval(42);            // true
boolval(0.0);           // false
boolval(4.2);           // true
boolval("");            // false
boolval("string");      // true
boolval([1, 2]);        // true
boolval([]);            // false
boolval(new stdClass);  // true

Nuevas funciones relacionadas con bases de datos

La extensión MySQLi ha añadido tres nuevas funciones relacionadas con las transacciones:

  • mysqli_begin_transaction(), indica que debe empezar una transacción.
  • mysqli_release_savepoint(), deshace los cambios de una transacción y vuelve hasta el punto de guardado que se indica.
  • mysqli_savepoint(), crea un nuevo punto de guardado dentro de una transacción.

Por su parte, la extensión PostgreSQL ha añadido dos nuevas funciones:

  • pg_escape_literal(), aplica el mecanismo de escape a un contenido antes de insertarlo en la base de datos. Se recomienda el uso de esta nueva función en vez de pg_escape_string().
  • pg_escape_identifier(), aplica el mecanismo de escape a una cadena de texto que contiene el nombre de una tabla o de un campo de la base de datos y que va a ser utilizado en una consulta.

Nuevas funciones de la extensión gd

La librería GD utilizada por PHP se ha actualizado a la versión 2.1, lo que añade nuevas funcionalidades, corrige algunos errores y mejora el rendimiento global.

La nueva función imageflip() voltea horizontal o verticalmente una imagen. El primer argumento es la imagen que se manipula y el segundo es una constante que define el tipo de volteo a realizar: horizontal (IMG_FLIP_HORIZONTAL), vertical (IMG_FLIP_VERTICAL) o los dos a la vez (IMG_FLIP_BOTH).

$rutaImagen = 'foto.png';
$imagen = imagecreatefrompng($rutaImagen);

// voltearla verticalmente
imageflip($imagen, IMG_FLIP_VERTICAL);

// mostrar la imagen en el navegador
imagejpeg($imagen);
imagedestroy($imagen);

Ahora también es posible redimensionar imágenes con la función imagescale(). El primer argumento indica la imagen a redimensionar, el segundo argumento indica la nueva anchura en píxeles, el tercer argumento opcional indica la nueva altura en píxeles y el cuarto argumento opcional indica el tipo de escalado que se aplica:

$imagen = imagecreatefrompng('foto.png');

// la nueva anchura de la imagen será 600 píxel
// (la altura se calcula automáticamente para mantener las proporciones)
imagescale($imagen, 600);

// la nueva imagen será de 600 x 350 píxeles
// (aunque eso suponga deformar la imagen original)
imagescale($imagen, 600, 350);

// el método empleado para redimensionar la imagen será
// el escalado bicúbico, mucho más lento pero de más calidad
// las constantes definidas son:
//   * IMG_NEAREST_NEIGHBOUR
//   * IMG_BILINEAR_FIXED
//   * IMG_BICUBIC
//   * IMG_BICUBIC_FIXED
imagescale($imagen, 600, 350, IMG_BICUBIC);

Recortar imágenes es un requerimiento habitual en las aplicaciones web. La nueva función imagecrop() simplifica al máximo esta tarea. Su primer argumento es la imagen a recortar y el segundo argumento es un array asociativo con las claves x, y, width y height que definen el área de corte:

$imagen = imagecreatefrompng('foto.png');

imagecrop($imagen, array('x' => 0, 'y' => 0, 'width' => 100, 'height' => 200));

Además de la función imagecrop() PHP 5.5 define una función relacionada llamada imagecropauto() para recortar las imágenes de forma automática. Su primer argumento es la imagen a recortar y el segundo argumento es alguna de las siguientes constantes: IMG_CROP_DEFAULT,IMG_CROP_TRANSPARENT,IMG_CROP_BLACK,IMG_CROP_WHITE y IMG_CROP_SIDES.

$imagen = imagecreatefrompng('foto.png');

imagecrop($imagen, IMG_CROP_TRANSPARENT);
imagecrop($imagen, IMG_CROP_SIDES);

Por último, se han añadido otras tres funciones menos importantes: imageaffinematrixconcat(), imageaffinematrixget() y imagepalettetotruecolor(), que convierte una imagen con un número limitado de colores en una imagen de color verdadero.

Nuevas funciones de la extensión curl

La principal función añadida por la extensión cURL es curl_file_create(), que permite crear fácilmente un objeto de tipo CURLFile para subir archivos con el método POST de HTTP. Su primer argumento es la ruta del archivo, el segundo argumento opcional es el tipo MIME del archivo y el tercer parámetro opcional es el nombre con el que se subirá el archivo:

$ch = curl_init('http://librosweb.es/subir_archivo.php');

$archivoCurl = curl_file_create('foto.jpg','image/jpeg','otro_nombre');

curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('otro_nombre' => $archivoCurl));

curl_exec($ch);

Si ejecutas el código del ejemplo anterior, el script que responda la URL subir_archivo.php recibirá un archivo llamado otro_nombre, de tipo JPEG y que contiene la imagen del archivo foto.jpg.

Además de esta función, se han añadido dos funciones complementarias llamadas curl_escape() y curl_unescape(). La primera codifica una cadena de texto para que sea seguro incluirla como parte de una URL. La segunda hace el proceso inverso para recuperar el contenido original de una cadena de texto codificada como parte de una URL.

Por último, se han añadido otras funciones como curl_pause(), que detiene o continúa la ejecución de las peticiones y curl_reset() que inicializa todas las opciones de la conexión a sus valores por defecto. Para ver el resto de funciones añadidas por cURL consulta el siguiente enlace: New cURL functions.

Nuevas funciones de la extensión socket

La extensión Socket ha definido tres nuevas funciones: socket_sendmsg() para enviar un mensaje a través de un socket, socket_recvmsg() que es la función complementaria para leer los mensajes recibidos a través de un socket y socket_cmsg_space(), que calcula el tamaño que debería reservarse como buffer de mensajes.

Nuevas funciones de la extensión intl

La extensión intl es con diferencia la que más funciones ha añadido en esta nueva versión de PHP. Además, en el momento de escribir este tutorial casi ninguna de esas funciones está documentada. Ver listado de nuevas funciones intl.

Nuevas funciones para la línea de comandos

Si ejecutas scripts de PHP a través de la consola de comandos, ahora puedes establecer el nombre del proceso bajo el que se ejecuta PHP. Este nombre es el que luego aparece al listar los procesos del servidor con comandos como top y ps. Establece el nombre del proceso PHP con la función cli_set_process_title() y obtén el nombre del proceso actual con la función cli_get_process_title().

Nuevos argumentos para las funciones

Además de añadir nuevas funciones, PHP 5.5 cambia los argumentos de algunas de las funciones existentes.

La función json_encode() ahora admite un tercer parámetro llamado $depth y que indica hasta qué nivel de profundidad (para los arrays) o hasta que nivel de recursividad (para los objetos) se tiene en cuenta para codificar el objeto o array.

Las funciones set_error_handler() y set_exception_handler() ahora admiten el valor null como argumento. En ese caso, devuelven respectivamente el anterior handler para errores y excepciones.

Las funciones de la extensión intl han recibido muchos cambios, que puedes consultar con detalle en el artículo Changed Functions

Por último, la función preg_replace() ya no soporta el modificador /e. Utiliza en su lugar la función preg_replace_callback().

Cambios incompatibles con las versiones anteriores de PHP

Para que su funcionamiento sea más parecido al del lenguaje Perl, se ha modificado el comportamiento de las funciones pack() y unpack().

La función pack() ahora soporta el formato Z, que se comporta igual que el formato a disponible anteriormente.

La función unpack() ha sufrido varios cambios:

  • Ahora soporta el formato Z para las cadenas rellenas con el carácter NULL y se comporta igual que el formato a (elimina todos los bytes NULL sobrantes).
  • Si se utiliza el formato a, se mantienen todos los bytes null sobrantes
  • El formato A ahora eliminar todos los espacios en blanco sobrantes.

El siguiente ejemplo muestra el código que debes utilizar en PHP 5.5 para mantener la retrocompatibilidad de los datos comprimidos con el formato a:

// código válido antes de PHP 5.5
$datos = unpack('a5', $datosComprimidos);

// a partir de PHP 5.5 el comportamiento cambia
if (version_compare(PHP_VERSION, '5.5.0-dev', '>=')) {
  $datos = unpack('Z5', $datosComprimidos);
} else {
  $datos = unpack('a5', $datosComprimidos);
}

Por otra parte, se han declarado obsoletas las siguientes cuatro funciones de la extensión Mcrypt: mcrypt_cbc(), mcrypt_cfb(), mcrypt_ecb() y mcrypt_ofb().

Funciones eliminadas

Por su poca utilidad práctica, PHP 5.5 ha eliminado las siguientes cuatro funciones cuyo resultado únicamente servía para mostrar el logotipo de PHP: php_logo_guid(), php_egg_logo_guid(), php_real_logo_guid() y zend_logo_guid().