¿Qué es lo nuevo en PHP 7.3?

El 6 de diciembe del 2018 salió a la luz la versión 7.3 de PHP y aunque no hubieron grandes mejoras como si las hubo en la version 7: PHP 7 – Acelerando el desarrollo web y versión 7. 1 7 Características novedosas de PHP 7.1 si vale la pena echarle un vistazo a todo lo nuevo que trae PHP 7.3.

Si su distribución GNU/Linux no tiene en sus repositorios oficiales la versión 7.3 consulte: Cómo compilar PHP-7.3 en Debian GNU/Linux

1. Sintaxis Heredoc y Nowdoc más flexibles

Ya no es necesario que el marcador de cierre vaya seguido de un punto y coma o una nueva línea. Además, el marcador de cierre pueder esta identado, en cuyo caso todas las líneas deben tener igual o mayor identación que el marcador de cierre.

Pienso que permirtir identar el marcador de cierre es una buena mejora desde el punto de vista de legibilidad del código ya que antes de la versión 7.3 usar Heredoc o Nowdoc significaba romper con la identación del código, veamos un ejemplo.

Antes de PHP 7.3

<?php
$sql = <<<SQL
SELECT col1, col2, col3
FROM table1 t1
INNER JOIN table2 t2 ON t2.table1_id = t1.id
SQL;
?>

A partir de PHP 7.3

<?php
$sql = <<<SQL
		SELECT col1, col2, col3
		FROM table1 t1
		INNER JOIN table2 t2 ON t2.table1_id = t1.id
	SQL;
?>

Vea Curso PHP.3 – Tipos de datos la sección Heredoc y Nowdoc para más detalles sobre como y cuando puede usar Heredoc y Nowdoc.

2. Desempaque de arreglos permite asignaciones por referencia

Ahora es posible realizar asignaciones por referencia (usando la sintaxis [&$a, [$b, &$c]] = $d) cuando se realiza un desempaque de un arreglo, veamos al siguiente ejemplo:

<?php
$countries = [
    ['SPAIN',   ['EUR', 'ES']],
    ['USA',     ['USD', 'EN']],
    ['ECUADOR', ['USD', 'EC']],
    ['CUBA',    ['CUC', 'CU']],
    ['FRANCE',  ['EUR', 'FR']]
];

foreach ($countries as [&$country_name, [&$currency, $code]]) {
    if ($code == 'CU') {
        $country_name = 'Cuba';
        $currency = 'CUP';
    }
}

var_dump($countries);

Si tratamos de ejecutar el código anterior en una version anterior a la versión 7.3 PHP lanza el siguiente error: Fatal error: [] and list() assignments cannot be by reference

3. El operador instanceof acepta literales en el primer operando

Ahora instanceof acepta literales como primer operando en cuyo caso siempre devuelve false

<?php
// Imprime falso
var_dump(4 instanceof stdClass);

Antes de PHP 7.3, PHP lanza el siguiente error: Fatal error: instanceof expects an object instance, constant given

En realidad no sé porque los desarrolladores agregaron esta característica pues no le veo mucha utilidad práctica.

4. Se agregó la excepción CompileError a la jerarquía de excepciones

PHP se sigue moviendo de su sistema tradicional de manejo de errores a una jerarquía de excepciones muestra de ellos es que se ha agregado una nueva excepción CompileError, de la cual hereda ParseError. Ahora algunos errores de compilación arrojarán un CompileError en lugar de generar un error fatal. Nótese que esto no significa que el motor de PHP lanzará excepciones cuando encuentre un error de sintaxis en nuestros ficheros PHP sino se refiere al hecho de compilar/evaluar código PHP desde nuestro código fuente por ejemplo usando la función eval.

<?php
try {
    $val = eval('<?php echo ?>');
} catch (ParseError $e) {
    echo get_parent_class($e);
}

5. Comas en funciones y métodos

Las llamadas a métodos y funciones permiten comas finales en los parámetros de llamadas.

<?php
function my($p1, $p2) {
    echo "$p1 $p2";
}
// Imprime Hola Mundo!
my('Hola', 'Mundo!',);

Antes de PHP 7.3 el código anterior lanza el siguiente error: Parse error: syntax error, unexpected ')'

6. Soporte para Argon2id

El argumento de configuración --with-password-argon2 ahora proporciona soporte para los hashes Argon2i y Argon2id en las funciones password_hash(), password_verify(), password_get_info() y password_needs_rehash(). Las contraseñas se pueden codificar y verificar utilizando la constante PASSWORD_ARGON2ID. La compatibilidad con Argon2i y Argon2id en las funciones de password_* requiere libargon2 ≥ 20161029.

Argon2 es una función de hash de contraseña ganadora de la Password Hashing Competition. Fue diseñada por Alex Biryukov, Daniel Dinu y Dmitry Khovratovich de la Universidad de Luxemburgo. ] La implementación de referencia de Argon2 se publica bajo una licencia Creative Commons CC0 (es decir, dominio público) o la Licencia Apache 2.0, y proporciona tres variantes:

  • Argon2d es más rápida y maximiza la resistencia a los ataques de craqueo de GPU debido a que usa acceso de memoria dato dependiente, es adecuada para aplicaciones sin amenazas de ataques de temporización de canal lateral (por ejemplo, criptomonedas).
  • Argon2i está variante usa acceso de memoria independiente de los datos y es recomendable usarla para generar hash de contraseña, pero es más lenta ya que hace más pases sobre la memoria para protegerse de ataques de compensación (tradeoff). Argon2id es un híbrido de Argon2i y Argon2d y utiliza una combinación de accesos a la memoria dato dependientes y acceso a la memoria independientes de los datos, lo que proporciona cierta resistencia a ataques de temporización de canal lateral y gran parte de la resistencia de Argon2d a los ataques de craqueo de GPU.

7. Nuevas funciones agregadas al núcleo de PHP

  • array_key_first(): Devuelve la primera llave de un arreglo
  • array_key_last(): Devuelve la última llave de un arreglo
  • gc_status(): Devuelve información sobre el recolector de basura
    array (size=4)
      'runs' => int 0
      'collected' => int 0
      'threshold' => int 10001
      'roots' => int 1
    
  • hrtime(): Devuelve el tiempo de alta resolución del sistema.
  • is_countable(): Verifica que el contenido de una variable sea una arreglo o un objeto que implemente Countable
  • net_get_interfaces(): Devuelve un arreglo llave => valor con información de todas las interfaces (físicas) de red.

Consulte New Functions para ver todas las nuevas funciones incluídas en esta versión de PHP.


YouTube video

PHP nuevas características, 3 (8)

Deja un comentario

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.