PHP 7.2 se lanzó oficialmente el 30 de noviembre. El lanzamiento tiene nuevas características, funciones y mejoras que nos permitirán escribir mejor código. En este post, presentaremos algunas de las características más interesantes del lenguaje con PHP 7.2.

Actualización: ¡PHP 8.0 ya está disponible para todos los clientes de Kinsta.

Puede ver la lista de cambios completa en la página Requests For Comments.

Mejoras Principales

Declaraciones de tipo de argumento

Desde PHP 5, podemos especificar en la declaración de una función el tipo de argumento que se espera que sea pasado. Si el valor dado es de un tipo incorrecto, PHP generará un error.

Declaraciones de tipo de argumento (también conocidos como type hints) especifican el tipo de una variable que se espera pasar a una función o método de clase.

Aquí es un ejemplo:

class MyClass {
	public $var = 'Hello World';
}

$myclass = new MyClass;

function test(MyClass $myclass){
	return $myclass->var;
}

echo test($myclass);

En este código, la función prueba espera un instanceof MyClass. Un tipo de datos incorrecto daría como resultado el siguiente error fatal:

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of MyClass, string given, called in /app/index.php on line 12 and defined in /app/index.php:8

Desde PHP 7.2 type hints se pueden usar con el tipo de datos de objeto, y esta mejora permite declarar un objeto genérico como argumento de una función o método. Aquí es un ejemplo:

class MyClass {
	public $var = '';
}

class FirstChild extends MyClass {
	public $var = 'My name is Jim';
}
class SecondChild extends MyClass {
	public $var = 'My name is John';
}

$firstchild = new FirstChild;
$secondchild = new SecondChild;

function test(object $arg) {
	return $arg->var;
}

echo test($firstchild);

echo test($secondchild);

En este ejemplo, hemos llamado a la función de prueba dos veces, pasando un objeto diferente en cada llamada. Esto no fue posible en versiones anteriores de PHP.

Comandos Docker
Probar type hints con PHP 7.0 y PHP 7.2 en Docker

Declaraciones de tipo de devolución de objeto

Si las declaraciones de tipo de argumento especifican el tipo esperado para los argumentos de una función, las declaraciones de tipo de devolución especifican el tipo esperado del valor de devolución.

Declaraciones de tipo de devolución especifican el tipo del valor que se espera ser devuelto desde una función.

A partir de PHP 7.2, podemos usar declaraciones de tipo de devolución para el tipo de datos de objeto. Aquí es un ejemplo:

class MyClass {
	public $var = 'Hello World';
}

$myclass = new MyClass;

function test(MyClass $arg) : object {
	return $arg;
}

echo test($myclass)->var;

Versiones anteriores de PHP generan el siguiente error fatal:

Fatal error: Uncaught TypeError: Return value of test() must be an instance of object, instance of MyClass returned in /app/index.php:10

Por supuesto, en PHP 7.2 este código «echoes» ‘Hello World’.

Ampliación de Tipo de Parámetros

Actualmente, PHP no permite ninguna variación de tipos de parámetros entre las clases «child» y sus clases o interfaces «parent». ¿Qué significa eso?
Considerar el siguiente código:

<?php
class MyClass {
	public function myFunction(array $myarray) { /* ... */ }
}

class MyChildClass extends MyClass {
	public function myFunction($myarray) { /* ... */ }
}

Aquí hemos omitido el tipo de parámetro en la subclase. En PHP 7.0 este código genera la siguiente advertencia:

Warning: Declaration of MyChildClass::myFunction($myarray) should be compatible with MyClass::myFunction(array $myarray) in %s on line 8

Desde PHP 7.2, podemos omitir un tipo en una subclase sin romper ningún código. Esta propuesta nos permitirá actualizar las clases para usar type hints en las librerías sin tener que actualizar todas las subclases.

Coma final (trailing commas) en sintaxis de lista

Tener una coma al final de la última entrada definida en el array es una sintaxis válida en PHP, y a veces se recomienda para agregar fácilmente elementos nuevos y evitar errores de análisis debido a la falta de una coma. Desde PHP 7.2, podemos usar comas finales en espacios de nombre (namespaces) agrupados.

Para obtener una vista más cercana de este RFC (Requests for comments) y algunos ejemplos de código, vea Comas Finales en Sintaxis de Lista.

Mejoras de Seguridad

Argon2 en hash de contraseñas

Argon2 es un algoritmo de encriptación (hashing) poderoso que en 2015 fue seleccionado como ganador de la Password Hashing Competition, y PHP 7.2 nos lo traerá como una alternativa segura al algoritmo Bcrypt.
La nueva versión de PHP introduce la constante PASSWORD_ARGON2I, que ahora se puede utilizar en funciones password_*:

password_hash('password', PASSWORD_ARGON2I);

A diferencia de Bcrypt, que solo toma un factor de costo, Argon2 toma tres factores de costo que se distinguen de la siguiente manera:

  • Un costo de memoria (memory cost) define el número de KiB que se debe consumir durante el proceso de hashing (valores por defecto son 1<<10, o 1024 KiB, o 1 MiB)
  • Un costo de tiempo (time cost) define el número de iteraciones del algoritmo hashing (valor por defecto es de 2)
  • Un factor de paralelismo (parallelism factor), establece el número de hilos paralelos (parallel threads) que se usarán durante el proceso de hashing (valor por defecto es de 2)

Tres nuevas constantes definen los factores de costo por defecto:

  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • PASSWORD_ARGON2_DEFAULT_TIME_COST
  • PASSWORD_ARGON2_DEFAULT_THREADS

Aquí es un ejemplo:

$options = ['memory_cost' => 1<<11, 'time_cost' => 4, 'threads' => 2];
password_hash('password', PASSWORD_ARGON2I, $options);

Para más información vea Argon2 Password Hash.

Libsodium como parte del Núcleo PHP

Desde la versión 7.2, PHP incluye la librería Sodium en el núcleo. Libsodium es una librería multiplataforma y multilingüe que nos permite encriptar, desencriptar, firmar, crear hash de contraseñas y más.
La librería fue previamente disponible a través de PECL.
Para obtener una lista documentada de las funciones de Libsodium, consulte la librería Quick Start Guide.
Vea también PHP 7.2: The First Programming Language to Add Modern Cryptography to its Standard Library.

Funciones y Características Obsoletas (Deprecations)

Aquí es una lista de las funciones y características obsoletas de PHP 7.2 que se eliminarán a más tardar que PHP 8.0:

La función __autoload ha sido reemplazada por spl_autoload_register en PHP 5.1. Ahora se generará un aviso de obsolescencia cuando se detecta durante la ejecución.

La variable $php_errormsg se crea en un alcance local cuando se produce un error no fatal. Desde PHP 7.2 error_get_last y error_clear_last se deberían usar en su lugar.

create_function() permite la creación de una función con un nombre de función generado, una lista de argumentos y un código de cuerpo proporcionados como argumentos. Debido a problemas de seguridad y bajo rendimiento, se ha marcado como obsoleto y, en su lugar, se recomienda el uso del carácter circundante (enclosure).

La configuración de mbstring.func_overload ini establecida en un valor distinto de cero se ha marcado como obsoleta.

(unset) cast es una expresión que siempre devuelve nulo y se considera inútil.

parse_str () analiza una cadena de consulta en un array si se proporciona el segundo argumento, o en la tabla de símbolos local si no se usa. Como las variables de configuración dinámica en el alcance de la función no se recomiendan por razones de seguridad, el uso de parse_str () sin el segundo argumento generará un aviso de obsolescencia.

gmp_random() se considera dependiente de plataforma y quedará obsoleta. En su lugar use gmp_random_bits() y gmp_random_rage().

each() se usa para iterar sobre un arreglo (array) muy similar a foreach(), pero foreach() es preferible por varias razones, incluyendo ser 10 veces más rápido. Esto significa que la función each() pronto será obsoleta.

La función assert() verifica la afirmación dada y toma las acciones apropiadas si el resultado es FALSO. El uso de assert () con argumento de cadena ahora es obsoleta ya que abre una vulnerabilidad RCE. Se puede usar la opción zend.assertion ini para evitar la evaluación de expresiones de afirmación.

$errcontext es un arreglo (array) que contiene las variables locales existentes cuando se genera un error. Se pasa como último argumento a manejadores de errores establecidos con la función set_error_handler ().

¿Qué Significa PHP 7.2 para los Usuarios de WordPress?

Según la página de estadísticas oficial de WordPress, al tiempo de escribir esto sólo el 19.8% de usuarios de WordPress han actualizado a PHP 7. Y sólo el 5% utiliza PHP 7.1. Como puede ver una gran mayoría de los usuarios, más del 40%, siguen ejecutando en PHP 5.6. Lo que es aún más atterador es que más del 39% de los usuarios utilizan versiones de PHP no soportadas. A partir de diciembre de 2016, WordPress.org realmente destacó su recomendación oficial para usuarios de PHP 5.6 a PHP 7 o superior.

Estadísticas de WordPress PHP 7.1
Estadísticas de WordPress PHP 7.1

Los números anteriores son especialmente desalentadores desde el punto de vista del rendimiento, ya que PHP 7 ha demostrado ser significativamente más rápido. Aquí son unas estadísticas:

  • Puntos de referencia oficiales de PHP muestran ques PHP 7 permite que el sistema ejecute el doble de solicitudes por segundo en comparación con PHP 5.6, a casi la mitad de la latencia.
  • Kinsta ejecutó sus propios puntos de referencia de rendimiento PHP 5.6 vs PHP 7 vs HHVM. Y de manera similar a los puntos de referencia anteriores, vieron que PHP 7 podía ejecutar casi tres veces más transacciones por segundo en comparación con PHP 5.6.
  • Christian Vigh también una comparación de rendimiento de PHP en el que descubrió que PHP 5.2 era un 400% más lento que PHP 7.

Hemos ejecutado nuestras propias pruebas de rendimiento en 2018 con PHP 5.6 vs PHP 7 vs HHVM. Similarmente a los rendimientos de arriba hemos visto que PHP 7.2 podía ejecutar casi 3 veces más transacciones (solicitudes) por segundo que PHP 5.6.

Rendimiento de WordPress
Rendimiento de WordPress
  • WordPress 4.9.4 PHP 5.6 resultado de rendimiento: 49.18 sol/seg
  • WordPress 4.9.4 PHP 7.0 resultado de rendimiento: 133.55 sol/seg
  • WordPress 4.9.4 PHP 7.1 resultado de rendimiento: 134.24 sol/seg
  • WordPress 4.9.4 PHP 7.2 resultado de rendimiento148.80 sol/seg ?
  • WordPress 4.9.4 HHVM resultado de rendimiento: 144.76 sol/seg

Muchos tardan en actualizarse simplemente por el tiempo que lleva probar nuevos plugins y temas de terceros para garantizar que funcionen correctamente. Pero muchas veces, todo se reduce a que simplemente no lo han hecho todavía. ¿No está seguro de qué versión de PHP está ejecutando? Una de las maneras más fáciles de averiguarlo es usar una herramienta como Pingdom o Google Chrome Devtools. El primer encabezado de solicitud HTTP generalmente le mostrará la versión.

Verifique la versión de PHP
Verifique la versión de PHP

Esto depende de que el host no modifique el valor del encabezado X-Powered-By. Si lo hacen, es posible que no vea su versión de PHP, en cuyo caso necesitará subir un archivo a través de FTP. O siempre puede comunicarse con su host y preguntar.

Actualizar a PHP 7.2

Una vez PHP 7.2 salga puede comenzar a probar. Puede probar su sitio de WordPress localmente o verificar sus scripts en un entorno como Docker, que le permite probar diferentes versiones de PHP desde la línea de comandos.

O puede utilizar un entorno de staging, ya que se parecerá más a un sitio de producción en vivo. Kinsta hizo PHP 7.2 disponible para todos los clientes el 4 de diciembre. Puede fácilmente crear un entorno de staging con un solo clic.

Pruebe PHP 7.2 en un entorno de staging
Pruebe PHP 7.2 en un entorno de staging

Simplemente haga un solo clic para cambiar el motor de PHP para el sitio de staging en «Herramientas» y podrá comenzar las pruebas para asegurarse de la compatibilidad de los plugins y temas de terceros. Una vez que confirme que todo funciona, puede cambiar su sitio de producción a PHP 7.2 o pasar su sitio de staging a vivo.

Cambiar a PHP 7.2
Cambiar a PHP 7.2

Conclusiones

¿Está listo para cambiar a PHP 7.2? Con suerte, por ahora, al menos ha hecho la transición a PHP 7. Si no lo ha hecho, ahora es un buen momento para comenzar a probar. Por lo tanto, actualice sus scripts, verifique su código y háganos saber sus primeras impresiones de PHP 7.2.

Carlo Daniele Kinsta

Carlo es un diseñador y desarrollador de front-end freelance. Cuando escribe artículos y tutoriales, Carlo se ocupa principalmente de los estándares web, pero cuando juega con sitios web, su mejor compañero de trabajo es WordPress.