PHP 8 - Nuevas características, mejoras y problemas potenciales con WordPress

Marten Gülink Actualizado el 11.01.2021
10 min.
actualización de php 8 major
Actualizado el 11.01.2021


¡Php 8 está aquí! La actualización principal se publicó el 26 de noviembre de 2020 y nos trae algunos cambios básicos así como muchas características nuevas. En cuyo caso PHP 8 realmente conduce a un mejor rendimiento y si usted como WordPress User:in ya debe actualizarse a la nueva versión, nuestro desarrollador Marten le explica.

Introducción a PHP 8 

PHP 8 se introdujo por primera vez en su probador alfa:innen el 18 de junio de 2020 y ha estado en congelación de características desde julio. Hasta que el lanzamiento en 26 de noviembre por lo tanto no se permitió añadir nuevas adiciones. Una característica especial de esta versión es que nos saltamos PHP 7.5 y vamos directamente a PHP 8. Y este salto está conectado con un montón de características. 

Una de las preguntas más comunes sobre PHP 8 que los usuarios de WordPress :inside probablemente se preguntan es: ¿Mejorará PHP 8 el rendimiento de mi sitio web?

La respuesta a esta pregunta es, como tantas veces, "Depende..."

Cuando PHP fue actualizado de la versión 5 a la 7, hubo un gran aumento de rendimiento. Pero con PHP 8 usted no hay una mejora general en el rendimientoa menos que la aplicación tu calcule muchas funciones matemáticas (ver nuestra sección sobre el compilador JIT). Esto se debe principalmente a que la optimización del código de PHP ya está bien establecida.

¿Pero quién dice que el rendimiento se limita a compilar el tiempo de todos modos? Por mi parte, como desarrollador, mediría el rendimiento de varias maneras, incluyendo las funciones disponibles para escribir código bien estructurado. Y PHP 8 está lleno de nuevas cosas. Así que, ¡comencemos!

Las nuevas actualizaciones de características más importantes en PHP 8 

PHP 8 tiene ocho nuevas características principales que me gustaría presentarles brevemente: 

  1. El compilador JIT 
  2. Atributos
  3. Argumentos nombrados
  4. las expresiones de los partidos 
  5. expresiones de lanzamiento
  6. Tipo de retorno estático 
  7. tipo de unión 
  8. tipos mixtos 

El compilador JIT (justo a tiempo) (rfc)

Cuando se ejecuta el código PHP, normalmente se hace compilándolo en instrucciones virtuales que se ejecutan en una máquina virtual. JIT cambiará esto compilando el código en código de máquina x86 y luego ejecutando ese código directamente en el CPU. Para las aplicaciones que dependen en gran medida de las funciones matemáticas, esto debería mejorar el rendimiento. Sin embargo, esto no se espera para las aplicaciones web promedio (ver gráfico). 

PHP 8 - Nuevas características, mejoras y problemas potenciales con WordPress
Fuente

Para ver un ejemplo del aumento de rendimiento que se puede lograr a través de JIT, mira el siguiente video.

YouTube

Al cargar el vídeo, aceptas la política de privacidad de YouTube.
DESCUBRIR MÁS

Cargar video

PGlmcmFtZSBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUtbm9jb29raWUuY29tL2VtYmVkL2RXSDY1cG1uc3JJIiBhbGxvdz0iYWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSIgYWxsb3dmdWxsc2NyZWVuPSIiIHdpZHRoPSI1NjAiIGhlaWdodD0iMzE1IiBmcmFtZWJvcmRlcj0iMCI+PC9pZnJhbWU+

Básicamente, el resultado final es que la aplicación tu funcionará mejor con la nueva versión si usas PHP para una tarea matemática de trabajo intensivo. Pero si usas PHP como la mayoría de los usuarios de WordPress :inside, no verás muchos cambios. Más sobre lo que significa PHP 8 para los operadores: dentro de los sitios web de WordPress explicaré a continuación. 

Continúa con las nuevas características:

Atributo v2 (rfc, rfc)

Una de las nuevas características de PHP 8 (que ha dado lugar a amplios debates en la comunidad de PHP) son los atributos - conocidos en muchos otros idiomas como "anotaciones". En PHP 8, los atributos reemplazan el almacenamiento de metadatos de Docblocks. Esto es lo que se ha tenido que utilizar para declarar metadatos de clases, métodos, funciones y argumentos de forma estructurada. 

Como puedes imaginar, usar comentarios de código para aplicar metadatos no era lo ideal, pero funcionó. Afortunadamente, ya no tendremos este problema. 

los atributos pueden ser establecidos con el Syntax #[...] debe ser declarado.

Aquí hay algunos ejemplos de la RFC de cómo los atributos pueden ser aplicados a diferentes tipos de datos

#[ExampleAttribute]
class Foo
{
    #[ExampleAttribute]
    public const FOO = 'foo';
 
    #[ExampleAttribute]
    public $x;
 
    #[ExampleAttribute]
    public function foo(#[ExampleAttribute] $bar) { }
}
 
$object = new #[ExampleAttribute] class () { };
 
#[ExampleAttribute]
function f1() { }
 
$f2 = #[ExampleAttribute] function () { };
 
$f3 = #[ExampleAttribute] fn () => 1;

En este punto, cabe señalar que el RFC para los atributos ha sufrido algunos cambios desde su concepción original, lo que demuestra el esfuerzo y el pensamiento que se ha dedicado a esta actualización. 

Argumentos nombrados (rfc)

Argumentos nombrados le dan más flexibilidad a la hora de llamar a las funciones. Anteriormente, había que llamar a una función y pasar cada argumento en el orden en que la función lo especificaba. 

// Using positional arguments:
array_fill(0, 100, 50);

Con Named Arguments puede definir un nombre para cada parámetro. Y ahora puede llamarlos fuera de servicio, como se describe a continuación: 

// Using named arguments:
array_fill(start_index: 0, num: 100, value: 50);

También se puede acceder a ellos de la siguiente manera:

array_fill(value: 50, num: 100, start_index: 0);

También es posible un híbrido de ambos, que permite combinar parámetros con nombre y argumentos posicionales, mejorando así la legibilidad del código: 

htmlspecialchars($string, double_encode: false);

Expresiones de partido (rfc)

las expresiones de los partidos están destinados a resolver algunos problemas de larga data en la funcionalidad del predecesor Switch. 

Operador de comparación

Switch utiliza un operador relacional de conversión de tipo (==), lo que puede causar problemas. En cambio, Match utiliza un operador de comparación estricto (===), independiente de los tipos_estrictos.

valor de retorno

Las instrucciones de los interruptores a menudo generan un valor que se necesita más adelante en el flujo del programa. Puede suceder que este valor no esté establecido en la declaración Switch, lo que puede llevar a problemas en el script PHP. Además, la sintaxis de la declaración de Switch hace difícil leer declaraciones anidadas de Switch.

switch (1) {
    case 0:
        $y = 'Foo';
        break;
    case 1:
        $y = 'Bar';
        break;
    case 2:
        $y = 'Baz';
        break;
}
 
echo $y;
//> Bar

La nueva expresión de coincidencia resuelve este problema asignando directamente el valor de retorno de cada rama de coincidencia (=>), lo cual es más intuitivo. 

echo match (1) {
    0 => 'Foo',
    1 => 'Bar',
    2 => 'Baz',
};
//> Bar

Fallthrough

Si la declaración de un switch no tiene una ruptura después de cada caso, continuará en el siguiente caso, incluso si el código se rompe. Esto fue diseñado para que las funciones del interruptor puedan ejecutar varios bloques de código en secuencia. Sin embargo, esto ha sido una fuente de error común en el pasado. 

Match ha implementado una ruptura implícita después de cada rama (=>). Ahora se pueden ejecutar múltiples condiciones poniendo comas entre cada condición: 

match ($x) {
    1, 2 => {
        // Same for 1 and 2
    },
    3, 4 => {
        if ($x === 3) {
            // Only 3
        }
        // Same for 3 and 4
    },
}

Lanzar expresiones (rfc)

En PHP 8 la declaración de lanzamiento se ha convertido en una expresión. Esto significa que técnicamente, el lanzamiento puede ahora devolver un valor. Esto es útil en el sentido de que el lanzamiento puede ser usado ahora en muchos más lugares, como las Funciones de Flecha o los Operadores de Coalescencia. 

Funciones de las flechas:

$callable = fn() => throw new Exception();

Operadores Coalescentes:

// $value is non-nullable.
$value = $nullableValue ?? throw new InvalidArgumentException();
 
// $value is truthy.
$value = $falsableValue ?: throw new InvalidArgumentException();

Operadores Ternarios:

// $value is only set if the array is not empty.
$value = !empty($array)
    ? reset($array)
    : throw new InvalidArgumentException();

Tipo de retorno estático (rfc)

Como este RFC dice que Static Return Type permite devolver el nombre de clase especial "static" de un método: "El nombre de clase especial "static" en PHP se refiere a la clase a la que un método fue realmente llamado, incluso si el método es heredado. Esto se conoce como "encuadernación estática tardía" (LSB). Este RFC propone hacer la estática también utilizable como un tipo de retorno (junto a los tipos ya utilizables auto y padre).  

Sin embargo, la estática no puede utilizarse como parte de un parámetro en este caso. El retorno estático se referirá a la clase que fue llamada. 

Tipos de unión (rfc)

Tipos de unión le permiten declarar el tipo de valor que espera de una entrada. En algunos idiomas esto se llama esquema. Esto se describe sintácticamente mediante el uso de  | (por ejemplo string|array|int) está definido. Pero la magia no se detiene ahí, porque también puedes usar clases definidas como:

class MyClass {

}
function myFunction(string|array|int|MyClass){

}

Los tipos de unión ya se usan en PHP. Sin embargo, se aplican utilizando el método de anotaciones phpdoc, como se muestra a continuación. 

class Number {
    /**
     * @var int|float $number
     */
    private $number;
 
    /**
     * @param int|float $number
     */
    public function setNumber($number) {
        $this->number = $number;
    }
 
    /**
     * @return int|float
     */
    public function getNumber() {
        return $this->number;
    }
}

Para un poco más de contexto sobre el uso, ver este ejemplo del RFC:

class Number {
    private int|float $number;
 
    public function setNumber(int|float $number): void {
        $this->number = $number;
    }
 
    public function getNumber(): int|float {
        return $this->number;
    }
}

Todo esto se reduce al hecho de que se pueden utilizar varios tipos de entrada para la misma función en lugar de uno solo, lo que permite un mayor grado de reutilización del código.

Tipos mixtos (rfc)

En las versiones más recientes de PHP era posible declarar el tipo de datos de entrada y de retorno esperados. Sin embargo, PHP no siempre soportaba tipos, y esto es un problema. En algunos casos un tipo fue omitido o simplemente olvidado. Mezclaed Tipos está ahora tratando de resolver este problema.

Mostrar mixed sería el equivalente a array|bool|callable|int|float|null|object|resource|string

Aquí hay un ejemplo de la documentación de la RFC de cómo se utiliza esto:

// Valid example
 
class A
{
    public function foo(int $value) {}
}
 
class B extends A
{
    // Parameter type was widened from int to mixed, this is allowed
    public function foo(mixed $value) {}
}

Características adicionales de PHP 8

Hacer que la clasificación sea estable (rfc)

La estabilidad se añade a todas las funciones que entran en el ámbito de Sort (por ejemplo.

sort, rsort, usort, asort, arsort, uasort, ksort, krsort, uksort, array_multisort)

Le recomendaría que leyera esto en el Documentación del RFC y compararlo con la aplicación tus , ya que cambiar esta funcionalidad de una clasificación inestable a una estable podría afectar negativamente a su código.

Promoción de la propiedad de los constructores (rfc)

Esta característica debería ayudar a acelerar el flujo de trabajo de desarrollo y reducir los errores. Actualmente, la definición de un objeto de valores requiere un conjunto de calderas, como se muestra a continuación de la Documentación del RFC es evidente:

class Point {
    public float $x;
    public float $y;
    public float $z;
 
    public function __construct(
        float $x = 0.0,
        float $y = 0.0,
        float $z = 0.0,
    ) {
        $this->x = $x;
        $this->y = $y;
        $this->z = $z;
    }
}

Con este método, las propiedades deben ser repetidas tres veces. La mejora es la fórmula corta de abajo: 

class Point {
    public function __construct(
        public float $x = 0.0,
        public float $y = 0.0,
        public float $z = 0.0,
    ) {}
}

Operador de seguridad cero (rfc)

¡Hay un nuevo operador en este bloque! 

En lugar del clásico !== cero, ahora tenemos esto: ?->. Parece extraño al principio, pero si se mira desde el punto de vista de la concatenación de las declaraciones de "si", la aplicación se hace bastante clara: 

$country =  null;
 
if ($session !== null) {
    $user = $session->user;
 
    if ($user !== null) {
        $address = $user->getAddress();
 
        if ($address !== null) {
            $country = $address->country;
        }
    }
}
 
// do something with $country
$country = $session?->user?->getAddress()?->country;
 
// do something with $country

str_contains (rfc)

Esta nueva función, bastante agradable, devuelve un valor booleano (verdadero/falso) cuando se encuentra una cadena en otra cadena. Se necesitan dos argumentos, la cuerda que se debe buscar y la cuerda que se debe buscar.

str_contains('php8', '8'); // true
str_contains('php8', 'wordpress'); // false

Para obtener filtros de cadenas aún más útiles, deberías comprobar las siguientes nuevas características:

str_starts_with('haystack', 'hay'); // true
str_ends_with('haystack', 'stack'); // true

Estos dos devolverán un resultado booleano y trabajarán de la misma manera str_contains().

Mapas débiles (rfc)

Cuando se establece una variable con el valor de un objeto en PHP, normalmente se crea una referencia a ese objeto, pero no un nuevo objeto. 

Así que en este caso, puede terminar con muchas referencias a un objeto, pero sólo un objeto. El problema es que cuando llega el momento de borrar este objeto, PHP cuenta el número de referencias que este objeto tiene. Y si hay más de uno, PHP se negará a eliminar ese objeto. 

Mapas débiles resuelve este problema creando una referencia "débil" al objeto correspondiente. Una vez que el objeto es eliminado, todas las variables con los mapas débiles de referencia a este objeto se ponen a cero. 

Capturas sin captura (rfc)

Un bloque de prueba ya es bastante ingenioso cuando se trata de informar de errores y ahora hay una forma aún más rápida de implementarlo. Y no, no afectará realmente a la legibilidad. 

La forma de la "vieja escuela" significaba que tenías que pasar tu excepción de captura a una variable como esta

function catchMeWhenIFall(){
	try {
        throw new Exception('NOPE - GRAVITY');
    } catch (Exception $e) {
        return $e->getMessage();
    }

}

Pero ahora no necesitas definir la variable a pasar a tu bloque de captura.

try {
	throw new Exception('FOO!');
 catch  (){
	//Do some code here
 }

}

Más material de lectura de PHP 8

Si desea saber más sobre el lanzamiento de PHP 8, o si desea ver los ejemplos de código RFC por usted mismo, sólo tiene que echar un vistazo a la oficial Mensaje de liberación

¿Estás listo para PHP 8? 

Ningún desarrollador es fanático de las actualizaciones con grandes cambios (recordamos WordPress 5.0 y Gutenberg) donde existe el riesgo de que tu se rompa el código y le esperen horas de trabajo o una reconstrucción completa. Sin embargo, si el código de tu funcionó bien con PHP 7.4. no debería tener problemas con PHP 8 (más sobre PHP y WordPress en el siguiente capítulo). 

Sin embargo, si está usando una versión más antigua de PHP, debería comprobar la lista de funciones obsoletas antes de actualizarla. En el Documentación de los "Apéndices" de PHP encontrará una lista completa de características previas, cambios y problemas al actualizar de una versión de PHP a la siguiente. 

¿Debería actualizar tu WordPress a PHP 8? 

Para las bases de código bien escritas o que se han mantenido actualizadas con las últimas versiones de PHP, no hay un gran problema [para migrar a PHP 8]. La realidad, sin embargo, es que WordPress no es tal base de código.

Omar Reiss, yoast

Esa cita de la juventud...WordPress y el Informe de Compatibilidad con PHP 8" ya sugiere que usted como WordPress User:in no debe ser descuidado con la actualización a PHP 8. La conclusión del informe refuerza esta suposición, porque Omar Reiss escribe: "Con sólo investigar un subconjunto de cambios de ruptura en PHP 8 ya pudimos confirmar que es probable que esto cause una ruptura importante en sitios con un origen poco claro de esa ruptura. A menudo el error se produce en un lugar, pero es causado por un plugin o theme en un lugar diferente, lo que hace que estos problemas sean difíciles de depurar.

Estos problemas de compatibilidad son también una razón por la que PHP 8 no está disponible inmediatamente para nuestros clientes en RAIDBOXES panel de control . Especialmente después de grandes actualizaciones, siempre es una buena idea dar a los desarrolladores de Plugin el tiempo suficiente para hacer los ajustes necesarios y esperar el momento. Tan pronto como podamos asegurarnos de que no hay problemas con una instalación estándar de WordPress y que PHP 8 se ejecuta de forma estable y eficiente en nuestro sistema, por supuesto que pondremos a disposición PHP 8. 

Si ya tienes acceso a PHP 8 y quieres probar la nueva versión en el sitio web tus WordPress , deberías - como antes de cada actualización - crear primero una copia de seguridad. Como probar correctamente una nueva versión de PHP en RAIDBOXES puedes en este artículo de Helpcenter (aquí el ejemplo de PHP 7.2).

Nuestra conclusión

PHP 8 es un gran paso adelante comparado con sus versiones predecesoras. Si bien es posible que no vea inmediatamente una mejora drástica en el rendimiento (dependiendo de cómo utilice PHP 8), debería considerar la actualización, al menos después de probarla, que es estable y está disponible en su WordPress hoster La nueva versión es una progresión natural, y al implementarla más temprano que tarde, está creando una base sólida para la futura expansión, crecimiento y mejoras en el rendimiento.

¿Más preguntas sobre PHP 8?

Espero que este artículo haya podido mostrarles las nuevas y emocionantes características de PHP 8. ¿Tiene alguna otra pregunta sobre este tema? Por favor, use la función de comentarios. ¿Quieres más consejos sobre WordPress , diseño web y más? Entonces síguenos en TwitterFacebook o a través de nuestras newsletters.

Como desarrollador web en RAIDBOXES , Marten siempre está trabajando en nuevas características para nuestros clientes. En "wp unboxed" también puntúa con su conocimiento del desarrollo de la web, WordPress y nuestro panel de control . Y también en su tiempo libre le gusta trabajar en el autoHosting y las últimas tendencias en Internet.

Artículos relacionados

Comentarios sobre este artículo

Escribe un comentario

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