PHP 7.4 disponible!

Ya se encuentra implementada en todos nuestros servicios de hosting compartido y servidores virtuales la versión más actualizada de PHP.

Esta versión te va a optimizar el rendimiento y seguridad de tu web, esta trae algunas novedades que valen la pena mencionar y que pueden cambiar la manera de desarrollar algunas funcionalidades.

Que novedades nos trae PHP 7.4?

A continuación, te brindamos un resumen de las novedades que trae aparejada esta version, lo cual hara a esta versión de PHP mucho más rápida y fiable.

Arrow functions: estas funciones te permiten escribir funciones cortas con menos palabras.

Typed class properties: podrás crear tipos para las propiedades de tus clases.

Type variance: mejora en los tipos de retorno de las funciones.

Preloading: Permite al servidor cargar los ficheros PHP en memoria, mejorando así la velocidad de ejecución de las peticiones.

Null coalescing assignment operator: abreviatura para las operaciones que asignan un valor null si la primera condición no se cumple.

Numeric Literal Separator: podrás separar los valores numéricos por medio de guiones bajos o underscores.

Operador spread para arrays: Ahora podemos expandir una matriz desde cualquier lugar que deseemos en otra matriz, simplemente usando la sintaxis del operador de spread.

Weak References: Permite a los programadores retener una referencia a un objeto que no prevenga que el objeto mismo sea destruido.

Concatenation precedence: Se agrega una advertencia de deprecation cuando encuentra una expresión sin paréntesis que contiene a. antes de un signo + o .

Para obtener más información sobre las novedades de PHP 7.4 y las funciones que han quedado obsoletas visita el siguiente link.

PHP 7.4 entre otros beneficios, incrementa de forma significativa el desempeño y mejora sustancialmente la legibilidad del código, pasaremos a describir cada una de las novedades que estan vigentes en esta nueva version.

La versión anterior de PHP, la 7.3 nos trajo un incremento en el rendimiento de las aplicaciones (hasta un 10% comparado con PHP 7.2) así como una serie de mejoras sintácticas de a cara escribir código más limpio.

Con la llegada de PHP 7.4 vemos que esa tendencia se sigue manteniendo firme, de modo que continuaremos recibiendo este tipo de mejoras que nos favoreceran en cuanto a la simpleza de nuestro codigo y en cuanto a una mayor rapidez a la hora de ejecutar tareas.

Funciones flecha:

Las “arrow functions” llegan por fin a PHP, algo muy util para los que programan en Javascript. Estas funciones, también conocidas como “short closures” permiten escribir funciones cortas de una forma menos “verbosa”.

Supongamos que tenemos el siguiente código:

$prices = array_map(function (Product $product) {      
  return $product->getPrice();  
}, $products);

Con PHP 7.4 podemos convertirlo en:

$prices = array_map(fn($product) => $product->getPrice(), $products);

Entre las principales características de esta nueva sintaxis tenemos:

  • Es necesario que las funciones comiencen con fn (esta es la principal diferencia con Javascript donde no es necesario “marcarlas” con un prefijo).
  • Estas sólo pueden tener una expresión que es considerada el valor de retorno de la función, es decir, no podemos emplear llaves y declarar explícitamente el return . Seguramente esta sea la restricción más llamativa pero en palabras de Nikita Popov, creador de la RFC, la ventaja de emplear “arrow functions” en PHP no es mucha si necesitamos escribir funciones de más de una línea que terminarán por ser más verbosas de una forma u otra.
  • Tanto los argumentos como el valor de retorno pueden estar tipados, por ejemplo:
$prices = array_map(fn(Product $product): float => $product->getPrice(), $products);

El operador spread está permitido.

Y es posible pasar por referencia los argumentos y devolver por referencia los valores de retorno.

A diferencia de las closures normales, no es necesario emplear la palabra clave use para acceder a variables dentro del “scope” superior:

$multiplier = 5;  
array_map(fn($x) => $x * $multiplier, $numbers);

Typed class properties:

A partir de la version PHP 7.4 podremos tipar las propiedades de nuestras clases:

class User {
  public string $name;
  public ?int $age;
  public ContactInfo $contactInfo;
}

Las principales características de esta novedad son:

  • Solo está permitido tipar aquellas propiedades que tengan un modificador de acceso (public , protected o private).
  • No es posible emplear ni void ni callable para tipar propiedades.
  • A partir de ahora es necesario prestar atención a las variables no inicializadas que están tipadas. Por ejemplo, este código es válido:
class Foo {     
  public string $bar; 
}  
$foo = new Foo;

Sin embargo, en el momento en que escribamos:

var_dump($foo→bar);

Obtendremos un Fatal Error indicándonos que no podemos acceder a la propiedad $bar sin antes inicializarla:

Fatal error: Uncaught Error: Typed property Foo::$bar must not be accessed before initialization

  • Si empleamos unset sobre una propiedad tipada, ésta pasará a ser marcada como uninitialized a diferencia de lo que sucede con las no tipadas, que pasan a tener el valor null .
  • En el caso de propiedades escalares, es posible proveer un valor por defecto:
class User {     
  public int $age = 32;          
  public ?string $name = null;          
  public array $telephones = ['xxxx', 'bbbbb']; 
}

Type variance” mejorada en el retorno de funciones:

En PHH 7.4 se ha introducido una mejora en los tipos de retorno de las funciones, permitiéndonos realizar lo siguiente:

class Parent {};
class Child extends Parent {};class Foo 
{
  public function covariant(): ParentType {};
}class Bar extends Foo
{
  public function covariant(): ChildType {};
}

Es decir, una clase hija puede sobrescribir el tipo de retorno de un método de la clase padre si ese tipo extiende del tipo que devuelve el padre.

Esto se conoce en el argot como “covariant return types”.

Además, también se han introducido “contravariant arguments” de modo que:

class Parent {};
class Child extends Parent {};class Foo 
{
  public function contravariant(Child $value) {};
}class Bar extends Foo
{
  public function contravariant(Parent $value) {};

Lo cual cumple con el principio de sustitución de Liskov:

“Si S es un subtipo de T, entonces los objetos de tipo T pueden ser reemplazados con objetos de tipo S”

Nuevo operador: Null coalescing assignment operator:

Al “null coalescing operator” se le suma un nuevo operador que simplifica aún más ese tipo de asignaciones de modo que podemos pasar de escribir:

$someArray['key'] = $someArray['key'] ?? 'foo';

A:

$someArray['key'] ??= 'foo';

Operador spread para arrays:

Otra de las novedades sintáticas que trae PHP 7.4 consigo es el operador “spread” para arrays, algo con lo que seguro que ya estaras familiarizado si trabajas con Javascript regularmente.

Este nuevo operador nos permitirá escribir código como el siguiente:

$foo = [1, 2, 3];
$bar = ['a', 'b', 'c'];
$result = [0, ...$foo, ...$bar, 'd'];
// 0, 1, 2, 3, 'a', 'b', 'c', 'd'

Eso sí, de momento sólo es posible usarlo con arrays que tengan claves numéricas por lo que habrá que esperar a una siguiente versión para emplear este operador con arrays asociativos.

Preloading:

Ésta probablemente sea la novedad mas esperada pese a ser una característica de bajo nivel. Sin embargo su inclusión traerá consigo mejoras de rendimiento sustanciales.

A modo de resumen esta nueva característica permite al servidor precargar los archivos PHP en memoria de modo que estén permanentemente disponibles para todas las “requests” posteriores a la carga. Evidentemente esto supone una mejora muy significativa en la velocidad a la que se ejecutarán las peticiones pero que sin embargo nos obligará a reiniciar el servidor cada vez que modifiquemos el código fuente.

Estarás pensando que esta característica es muy similar a OPCache sin embargo no es exactamente lo mismo. OPCache lo que hace escoger los archivos fuente de PHP y compilarlo a “opcodes” los cuales son almacenados en disco. Estos “opcodes” son representaciones a bajo nivel del código de tu aplicación que pueden ser interpretados de forma más rápida en tiempo de ejecución puesto que es como si ya estuvieran en “lenguaje máquina” por lo que no es necesario que PHP los “traduzca”.

Además, los archivos generados de este modo por OPCache no tienen conocimiento de otros archivos. Es decir, si la clase Bar extiende de Foo , en tiempo de ejecución será necesario “linkarlas”.

Finalmente, OpCache tiene un mecanismo que comprueba si ha habido modificaciones en los archivos fuentes de cara a invalidar la cache en el caso de detectar cambios.

Es aquí donde se encuentra la principal diferencia con Preloading de PHP 7.4. Esta característica no sólo compila los archivos a “opcode” sino que también linka las clases relacionadas, “traits” e interfaces y lo almacena en memoria de modo que cuando llega una petición ya lo tiene disponible.

Para que preloading funcione, es necesario decirle al servidor qué archivos tiene que cargar en memoria. Esto se realiza con un simple script de PHP el cual linkaremos desde el archivo php.ini empleando la directiva opcache.preload :

opcache.preload=/path/to/project/preload.php

De este modo, todos los archivos que queramos que sean “precargados” tendremos que pasarlos a través de este script por medio de la instrucción opcache_compile_file() :

//preload.php
$files = ['file1.php', 'file2.php'];
foreach ($files as $file) {     
  opcache_compile_file($file); 
}

Si deseamos precargar clases en memoria debemos asegurarnos de que también cargamos sus dependencias (interfaces, “traits” y clases padre”) de otra manera recibiremos el siguiente error:

Can’t preload unlinked class Foo

Unknown parent Bar

Esto provoca que tengamos que prestar especial atención a la generación de este script de cara a no caer en este tipo de fallos de dependencias ausentes (algo que es muy facil que ocurra al momento de trabajar con un framework como Symfony). Por eso es que ya hay varios equipos trabajando en herramientas que automaticen la generación de este script empleando composer, de modo que se pueda añadir a este archivo la configuración de nuestro preload.

Numeric Literal Separator:

PHP 7.4 permite utilizar guion bajo para separar visualmente los valores numéricos. Tiene la siguiente apariencia:

$unformattedNumber = 107925284.88;

$formattedNumber = 107_925_284.88;

Los guiones bajo seran simplemente ignorados por el motor.

Weak References:

Ahora PHP 7.4 tiene una clase WeakReference, que no debe confundirse con la clase WeakRed o la extensión Weakref.

WeakReferences le permite al programador recordar una referencia a un objeto. Esto es útil porque no evita que el objeto sea destruido. Son útiles para implementar estructuras similares a la memoria caché.

Este es un ejemplo de uso de esta clase:

<? php
$ obj = new stdClass;
$ weakref = WeakReference :: create ($ obj);
var_dump ($ weakref-> get ());
sin establecer ($ obj);
var_dump ($ weakref-> get ());
?>

Además, ten en cuenta que no puedes serializar referencias débiles.

Concatenation precedence:

Actualmente, en PHP los operadores aritméticos “+” y “-“, y el operador de string “.” son puestos como asociativos y tienen el mismo precedente.

Como ejemplo, considera la siguiente línea:

echo "sum: " . $a + $b;

En PHP 7.3, este código produce la siguiente advertencia:

Warning: A non-numeric value encountered in /app/types.php on line 4

Esto es por que la concatenación es valorada de izquierda a derecha. Es lo mismo que escribir el siguiente código:

echo ("sum: " . $a) + $b;

Este cambio supone cambiar el precedente de los operadores, dando al “.” un precedente menor que a los operadores “+” y “-“, así que las adiciones y sustracciones podrían siempre desempeñarse antes de la concatenación de string. Esta línea de código debería ser equivalente a lo siguiente:

echo "sum: " . ($a + $b);

Esta es una propuesta de dos pasos:

Empezando desde la versión 7.4, PHP debería emitir un aviso de depreciación cuando se encuentre una expresión sin paréntesis con un “+” , “-“ y “.”.

El cambio real del precedente de estos operadores debería ser agregado con PHP 8.

Conclusión:

Como puedes ver, PHP 7.4 trae gran cantidad de mejoras por lo que recomiendo que poco a poco te comiences a familiarizar con ellas de cara adoptarlas en el código que escribas.

Como cambiar mi version de PHP:

Deberas seguir los siguientes pasos:

1- Ingresa al area de clientes de baehost con tu cuenta de correo y contraseña

https://baehost.com/en-int/clientarea

2- Dentro de la seccion de “Mis productos y Servicios”, haz clic en el nombre del pack que tienes contratado.

3- Dentro de la seccion de administracion de su hosting, haga clic en “Login to cPanel” que se encuentra en el modulo “Acciones” en el margen izquierdo:

4- Dentro de cPanel, haz clic en “Seleccionar version PHP”:

5- En la lista desplegable marque la version deseada y posteriormente haga clic en “Set as current”.

Nota importante: Antes de realizar cualquier actualización de PHP aconsejamos realizar una copia de seguridad, una actualización del CMS o en el caso de usar programación propia hacer una verificación de la compatibilidad de la programación con la versión de PHP.

Deja una respuesta