Novedades y cambios en PHP 5.6

La última versión de PHP ha sido lanzada oficialmente el 28 de agosto de 2014, tras un rodaje de casi 5 meses tenemos disponible la versión 5.6.5 lanzada el 22 de enero de 2015. Como ya es momento de empezar a pensar en actualizar nuestros sistemas, voy a hacer un pequeño repaso de los últimos cambios y novedades que trae consigo esta versión.

En lo primero que vamos a centrarnos es en los cambios que no son compatibles con versiones anteriores:

  • Las claves de un array no serán sobrescritas al definir un array como propiedad de una clase mediante un literal de array
  • Rigurosidad de json_decode(). Según la especificación de JSON, los literates de true, false y null deberían estar en minúscula, a partir de esta versión se rechazarán el resto de variantes
  • Las envolturas de flujos ahora verifican de manera predeterminada los certificados del mismo nivel y los nombres de host al usar SSL/TLS
  • Los recursos GMP ahora son objetos
  • Las funciones de Mcrypt ahora requieren claves e IV válidos

Tenéis más información sobre estos cambios en la documentación de php dedicada los cambios con incompatibilidades.

Y ahora la parte más interesante, al menos para mi, las nuevas características de PHP 5.6.

Expresiones escalares constantes: En una declaración de propiedad o en los argumentos predeterminados de una función, donde antes solo se admitía un valor estático, ahora se puede proporcionar una expresión escalar con literales numéricos, de cadena o constantes.

<?php

public function f($a = UNO + self::TRES) {}

?>

Funciones variádicas mediante «…» : Las funciones variádicas (lista de argumentos de longitud variable) se pueden implementar utilizando el operador … (tres puntos), sin necesidad de func_get_args().

<?php

function suma(...$param)
{
    //$param es un array con los argumentos proporcionados
    return array_sum($param);
}

echo suma(1, 3, 5); //retorna 9
echo suma(10, 10, 10, 10, 10); //retorna 50

?>

Desempaquetar argumentos mediante «…» : En otros lenguajes como Ruby esto se conoce como operador «splat» y con él se pueden desempaquetar arrays o objetos traversable en listas de argumentos para llamadas a funciones.

<?php

function concatena($prefijo, $lexema, $sufijo)
{
    return $prefijo.$lexema.$sufijo;
}

$a = array('DES', 'ESPERA', 'CIÓN');
echo concatena(...$a); //muestra DESESPERACIÓN

?>

Exponenciación mediante **: Se agrega un nuevo operador asociativo (**) para realizar la exponenciación, junto con el operador abreviado **=

<?php

echo 2 ** 3; //Muestra 8
$a = 3;
$a **= 2;
echo $a; //Muestra 9

?>

Ampliación del operador use: Se ha ampliado el uso de «use» para admitir la importación, además de clases, de funciones y constantes, mediante los constructores use function y use const.

<?php

namespace Mi\Espacio {
    const UNO = 1;
    function dos() { return "Function dos"; }
}

namespace {
    use const Mi\Espacio\UNO;
    use function Mi\Espacio\dos;
    
    echo UNO; //Muestra 1
    echo dos(); //Muestra Function dos
}

?>

phpdbg: Depurador interactivo implementado como un módulo de SAPI. Permite un completo control sobre el entorno sin impacto en la funcionalidad o el rendimiento del código.

Codificacion de caracteres predeterminada: default_charset se emplea como conjunto de caracteres predeterminados para las funciones htmlentities(), html_entity_decode() y htmlspecialchars(). El valor predeterminado es UTF-8

php://input reutilizable: php://input puede ser reutilizado tantes veces como sea necesario.

Ficheros grandes: Ahora se pueden subir ficheros de más de 2 GB

GMP soporta sobrecarga de operadores: Los objetos GMP (números enteros de longitud arbitraria usando la biblioteca MP de GNU) soportan la sobrecarga de operadores y la conversión a tipos escalares, lo que facilita la lectura del código.

<?php

$a = gmp_init(42);
$b = gmp_init(17);

echo $a + $b; //Muestra 59

?>

hash_equals() con seguridad contra ataques de temporización: Comparación de strings en tiempo constante, evitando así ataques por temporización, por ejemplo al comparar los hash de contraseñas de crypt(), asumiendo que no se puede usar password_hash() y password_verify().

Método mágico __debugInfo(): Con este método se pueden modificar las propiedades y los valores que se muestran cuando el objeto se imprime utilizando var_dump()

<?php

class Uno
{
        private $uno;

        public function __construct($uno)
        {
                $this->uno = $uno;
        }

        public function __debugInfo()
        {
                return ['propiedad' => $this->uno];
        }
}

$a = new Uno(10);

var_dump($a); //Muestra: object(Uno)#1 (1) { ["propiedad"] => int(10) }

?>

Algoritmo de hash gost-crypto: implementa la función de hash GOST empleando las tablas CryptoPro S-box

Mejoras en SSL/TLS: Mejoras en el soporte de SSL/TLS, incluyendo la habilitación de la verificación del par por omisión, soporte para la comparación de huellas digitales de certificados, mitigación de ataques de negociado TLS y mayor control en los ajustes de protocolos y verificaciones.

Soporte para pgsql asíncrono: La extensión pgsql admite conexiones y consultas asíncronas. Las conexiones asíncronas podrían esteblecerse mediante la constante PGSQL_CONNECT_ASYNC, y se podrían emplear las nuevas funciones pg_connect_poll(), pg_socket(), pg_consume_input() y pg_flush() para manejar conexiones y consultas asíncronas.

<?php

$db = pg_connect($conn_str, PGSQL_CONNECT_ASYNC);

?>

PHP 5.6 deja de ser beta

El equipo de desarrollo de PHP ha anunciado el lanzamiento de la primera release candidate, PHP 5.6.0RC1, por el momento no se recomienda su uso en entornos de producción, pero es importante revisar las novedades y cambios que trae para ir preparando nuestras aplicaciones.

Entre esta relase candidate y su predecesora en beta se ha añadido soporte en mysqlnd para MySQL 5.7 y se han solucionado algunos errores.

Entre las novedades más destacadas que llegan con PHP 5.6 está:

  • incorporación de un debbuger interactivo (phpdbg)
  • reutilización del flujo de lectura de php://input
  • soporte para ficheros de más de 2GB
  • inclusión del operador … (tres puntos) que permite la variación del número de argumentos en las funciones y el desempaquetado de arrays y objetos con interface travesable de forma similar a como se hace en Ruby
  • soporte para potenciación a través del operador **
  • mejoras en SSL/TLS y soporte para el algoritmo GOST

Warning: Creating default object from empty value

El titulo muestra el mensaje que despliega PHP cuando se intenta manejar una variable como si fuese un objeto (por ejemplo cuando sobre una variable vacía intentamos asignar valor a una propiedad).

<?php

$usuario->nombre = 'Salvador';
$usuario->apellido = 'Mendez';

?>

Hasta PHP 5.4 los mensajes E_STRICT no estaban incluidos en E_ALL, por lo que el código anterior no mostraba ningún tipo de error en la mayoría de configuraciones de servidores PHP. Pero a partir de 5.4 obtendremos «Warning: Creating default object from empty value in …».

Info extraída del manual de PHP:

En PHP 5 está disponible el nuevo nivel de error E_STRICT. Antes de PHP 5.4.0, E_STRICT no estaba incluido dentro de E_ALL, por lo que se teniía de habilitar explícitamente este tipo de nivel de error en PHP < 5.4.0. La habilitación de E_STRICT durante el desarrollo tiene algunos beneficios. Los mensajes STRICT proporcionan sugerencias que pueden ayudar a asegurarse de la mejor interoperabilidad y la compatibilidad hacia delante del código. Estos mensajes pueden incluir cosas como llamar a métodos no estáticos de forma estática, definir propiedades en una definición de clase compatible mientras se definió en un trait usado, y antes de PHP 5.3, algunas características obsoletas emitirían errores E_STRICT como asignar objetos por referencias durante la instanciación.

Es una forma de intentar que se respete el paradigma de orientación a objetos, así los mensajes E_STRICT ayudan a generar código PHP que ofrezca una mayor compatibilidad con versiones futuras.

Para evitar que se muestre ese error, debemos asegurarnos que trabajamos con objetos, generando uno vacío cuando no lo son:

<?php

if(!is_object($usuario))
{
    $usuario = new stdClass;
}

$usuario->nombre = 'Salvador';
$usuario->apellido = 'Mendez';

?>

Disponible PHP 5.5.10 y 5.4.26

El grupo de desarrolladores de PHP han anunciado la disponibilidad de las versiones 5.5.10 (listado de cambios) y 5.4.26 (listado de cambios). Como es habitual se recomienda a todos los usuarios actualizar a estas últimas versiones, están disponibles a través de la página de descarga.

También está disponible la versión de desarrollo 5.6.0alpha3, con los avances de la nueva versión.

Instalar Google Chrome en Linux a través de YUM

Google Chrome es ya uno de los navegadores de referencia en todas las plataformas y además cuenta con el beneplácito de los usuarios que ven en él un modo fácil y rápido de escapar a Internet Explorer, además de aportar muchas herramientas adicionales.

No es mi propósito hablar de las ventajas del navegador del buscador más popular de la red, para eso hay muchos artículos por la red, el interés de este post es hablar de cómo instalarlo en sistemas Red Hat y derivados a través del popular YUM.

Podemos optar por dos modos, el primero descargando directamente el RPM desde la página de Google y la segundo agregando el repositorio de YUM. El segundo método tiene evidentes ventajas sobre el primero, sobre todo a la hora de mantener actualizado el sistema.

Para instalarlo con el RPM en local, procedemos a descargarlo desde la web de Google, nos situamos en el directorio e instalamos con:

yum localinstall --nogpgcheck google-chrome-stable_current_x86_64.rpm

Para usar el segundo método, tendremos que crear el repositorio, para ello generamos el fichero /etc/yum.repo.d/google.repo y ponemos lo siguiente:


[google-chrome-32]
name=Google Chrome - 32-bit
baseurl=http://dl.google.com/linux/chrome/rpm/stable/i386
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

[google-chrome-64]
name=Google Chrome - 64-bit
baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

Podemos optar por montar uno sólo de los repositorios eligiendo el que corresponda a la arquitectura de nuestro procesador.

Después de esto sólo queda un paso para tener instalado Google Chrome:

#### Version Estable ###########
yum install google-chrome-stable
#### Version Beta ###########
yum install google-chrome-beta

Y … listo a disfrutar del navegador de Google en Linux.

Nota para desarrolladores web: Google Chrome tiene la misma base que Safari, por lo que si vuestra web está dando problemas en Mac y no tenéis uno a mano, podéis comprobar los errores con este navegador (muy útil con problemas en javascript)

Configurar Subversion para controlar las versiones del código

Para los que nos dedicamos al desarrollo de software es de vital importancia poder hacer un seguimiento de todos los cambios que realizamos en una aplicación, sobre todo cuando se trata de trabajar en equipo con distintos programadores realizando distintas tareas, e incluso llevar un control de los cambios que realizan distintos equipos dentro de un mismo software.

Cuando el proyecto está bajo el paraguas del software libre, herramientas como las proporcionadas por www.sourceforge.net son de mucha ayuda. Entre ellas se encuentra el uso de Subversion o CSV para la gestión de versiones. Personalmente prefiero subversion.

Este es un pequeño HOWTO de como configurar subversion corriendo bajo Apache, se presupone que se tiene instalado Apache, Subversion, el módulo DAV para Apache y las herramientas de administración de Subversion.

Lo primero que debemos hacer es crear un directorio para nuestro repositorio. Nuestro directorio principal para guardar nuestro control de versiones sobre subversion será /var/subversion/, dentro crearemos un subdirectorio donde se almacenarán los datos con subversion:

# mkdir /var/subversion/repositorio

Ahora debemos crear la estructura de subversion para almacenar las versiones y asignarle permisos para poder acceder:

# svnadmin create /var/subversion/repositorio/
# chmod 777 -R /var/subversion/repositorio/

Con esto ya tenemos listo el repositorio, ahora debemos generar el acceso a través de URL, para ello usaremos el módulo de Apache WebDav. Editaremos el fichero de módulo DAV de Apache (en Devian lo encontraremos en /etc/apache2/mods-available/dav_svn.conf), al final del fichero incluiremos las siguientes líneas:

# Acceso repositorio SVN

DAV svn
AuthType Basic
AuthName «Servidor Subversion»
SVNPATH /var/subversion/repositorio

En «Location» debemos poner la URL por la que queremos acceder al repositorio y en SVNPATH debemos colocar la ruta absoluta hacia el directorio que contendrá los ficheros de nuestro repositorio. Con esto ya debería estar funcionando nuestro repositorio con Subversion, basta con enlazarlo desde cualquier IDE que soporte control de versiones y comenzar a guardar las versiones de vuestros proyectos.

Como subversion no es sólo lo que he comentado, existe un estupendo manual donde podéis encontrar todas las funciones que ofrece este gestor de versiones.