Presentación de PHP 7.4: rendimiento, características, desaprobaciones

¿Qué significa PHP 7.4 para usted?


PHP evoluciona continuamente y acaban de lanzar su última actualización de PHP 7.4, llena de nuevas características. Como ya hemos demostrado en las últimas versiones de PHP 7, el rendimiento y la velocidad siguen avanzando. Una de las nuevas características más interesantes es la precarga . Acelera la ejecución del script e introduce la capacidad de tener un código más rápido y limpio debido a las líneas comunes de código simplificadas.

Las personas a cargo de PHP tomaron los comentarios y solicitudes de su audiencia en una consideración máxima y las respondieron sin problemas. Desde entonces, han estado cambiando continuamente el código para que sea más intuitivo y más cómodo cambiar entre lenguajes de programación.

PHP se usa en más del 78.9% de todos los sitios web. Según W3techs , los sitios más populares que usan PHP son Wikipedia, Pinterest y Facebook, por nombrar algunos.

Si observamos explícitamente los sitios de WordPress que ejecutan PHP, comparando PHP 5 y 7, podemos ver un aumento de doble velocidad. Los sitios web con tecnología de WordPress son los que más ganan al usar la última versión de PHP que existe.

imagen

Este gráfico ilustra la verdad sobre los sitios web que usan PHP activamente. Son 40 millones. sitios web en vivo lo suficiente como para llamar su atención? Así es como muchos están usando PHP en este momento. Además, PHP 7.4 ya presenta mejores resultados de prueba que PHP 7.3 con un rendimiento mejorado y otras actualizaciones de calidad de vida.

El siguiente gráfico muestra la prueba de referencia general en versiones nuevas y antiguas de PHP. Algunos de los criterios probados fueron la facilidad de uso, la velocidad y el rendimiento, entre otros.

imagen

¿Qué hay de nuevo en PHP 7.4?


Desde 2016, PHP7 ha lanzado actualizaciones anuales sin falta. Cada año ofrecen nuevas funciones, adiciones y la posibilidad de escribir un código más limpio que hace que el lenguaje sea más confiable y fácil de usar para aquellos que lo ejecutan en sus sitios web.

Analicemos y echemos un vistazo más de cerca a algunos de los cambios que se hicieron con la adición de PHP 7.4. Para obtener una lista completa, consulte su registro de cambios aquí .

Precarga


Hablemos del código. Cuando se utiliza un marco o bibliotecas, sus archivos deben cargarse y vincularse en cada solicitud. La precarga es cuando puede cargar marcos y bibliotecas en OPCache. Permite que el servidor cargue los archivos PHP y los almacene en la memoria durante el inicio y los tenga disponibles para futuras solicitudes. Hable acerca de hacer que las cosas vayan rápido

La precarga se ejecuta mediante una directiva php.ini específica: opcache.preload . Esto tiene el compilador de script PHP y se ejecuta cuando se inicia el servidor. También se puede usar para precargar más archivos y elegir incluirlos o compilarlos.

Esto es asombroso Sin embargo, si alguna vez se cambia la fuente de los archivos precargados, el servidor debe reiniciarse. Los archivos precargados también permanecen en caché en la memoria OPCache para siempre.
Sin embargo, estos archivos precargados continuarán estando disponibles para futuras solicitudes en caso de que alguna vez necesite usarlos nuevamente.

Operador extendido en expresiones de matriz


Cuando se lanzó PHP 5.6, PHP comenzó a admitir el desempaquetado de argumentos (operador de propagación), pero ahora, con 7.4, podemos usar esta función con una expresión de matriz. El desempaquetado de argumentos es una sintaxis para desempaquetar matrices y Traversables en listas de argumentos. Y, para hacerlo, solo necesita ser antepuesto por ... (3 puntos). Eso es todo.

Veamos este ejemplo:

$animals = ['dog', 'cat']; $animalkingdom = ['lion', 'elephant', ...$animals, 'giraffe']; // ['lion', 'elephant', 'dog', 'cat', 'giraffe']; 

Ahora podemos expandir una matriz desde cualquier lugar que queramos en otra matriz, simplemente usando la sintaxis del Operador de propagación.

Aquí hay un ejemplo más largo:

 $num1 = [1, 2, 3]; $num2 = [...$num1]; // [1, 2, 3] $num3 = [0, ...$num1]; // [0, 1, 2, 3] $num4 = array(...$num1, ...$num2, 111); // [1, 2, 3, 1, 2, 3, 111] $num5 = [...$num1, ...$num1]; // [1, 2, 3, 1, 2, 3] 

No solo eso, sino que también puedes usarlo en una función. Mira este ejemplo:

 function getNum() { return ['a', 'b']; } $num6 = [...getNum(), 'c']; // ['a', 'b', 'c'] $num7 = [...new NumIterator(['a', 'b', 'c'])]; // ['a', 'b', 'c'] function arrGen() { for($i = 11; $i < 15; $i++) { yield $i; } } $num8 = [...arrGen()]; // [11, 12, 13, 14] 

Además, ahora puede desempaquetar matrices y generadores que una función devuelve directamente a una nueva matriz.

Un ejemplo de código se vería así:

 function getAnimals(){ return ['dog', 'cat', 'elephant']; } $num1 = [...getAnimals(), 'lion', 'tiger', 'giraffe']; 

Y con PHP 7.4, imprimiría:

 array(6) { [0]=> string(3) "dog" [1]=> string(3) "cat" [2]=> string(8) "elephant" [3]=> string(4) "lion" [4]=> string(5) "tiger" [5]=> string(7) "giraffe" } 

Con esta nueva expresión de matriz, los operadores de propagación deberían tener un rendimiento mucho mejor en 7.3 array_merge. Esto se debe a que el operador de propagación es una estructura de lenguaje, mientras que array_merge es una función. También porque el operador spread admite objetos que implementan traversable y array_merge solo admite matrices.

Algunas cosas importantes a tener en cuenta, solo puede usar matrices indexadas ya que las claves de cadena no son compatibles. Si se usa, se arrojará un error recuperable en la pantalla, una vez que se encuentre una clave de cadena.
Otro beneficio glorioso de 7.4 es la eliminación de array_merge. ¡Diga adiós al temido cambio de índice!

Por ejemplo, echemos un vistazo a esta combinación de matriz de largo aliento a continuación:

 $array = ['banana, 'orange']; $array[2] = 'orange'; $array[1] = 'apple'; //shifting var_dump($array); // prints array(3) { [0]=> string(6) "banana" [1]=> string(5) "apple" [2]=> string(6) "orange" 

Otro beneficio de 7.4 es usar la función de generador. Una función generadora funciona igual que una función normal, excepto que en lugar de devolver un valor, una función generadora produce tantos valores como sea necesario.

Mira el código de ejemplo a continuación:

 function generator() { for ($i = 3; $i <= 5; $i++) { yield $i; } } $num1 = [0, 1, 2, ...generator()]; 

Referencias débiles


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é.

 WeakReference { /* Methods */ public __construct ( void ) public static create ( object $referent ) : WeakReference public get ( void ) : ?object } 

Parámetros contravariantes y retornos covariantes


Actualmente, PHP utiliza principalmente tipos de parámetros invariables y tipos de retorno. Es decir, si un método tiene un parámetro o tipo de retorno de X, entonces el parámetro de subtipo o tipo de retorno también debe ser de tipo X.

Ahora, con PHP 7.4, propone permitir covariantes (ordenadas de específicas a genéricas) y contravariantes (invertir el orden) en los parámetros y tipos de retorno.

Aquí hay un ejemplo de ambos:

Ejemplo de tipo de retorno covariante:

 interface Factory { function make(): object; } class UserFactory implements Factory { function make(): User; } 

Ejemplo de tipo de parámetro contravariante:

 interface Concatable { function concat(Iterator $input); } class Collection implements Concatable { // accepts all iterables, not just Iterator function concat(iterable $input) {/* . . . */} } 

Propiedades tipificadas 2.0


Desde PHP 5, las sugerencias de tipo han sido una característica disponible que le permite especificar el tipo de variable que se espera pasar a una función o clase. En las migraciones de PHP 7.2, la adición del tipo de datos del objeto dio la esperanza de que habría más disponibles en el futuro. El futuro es ahora.

En el nuevo 7.4, PHP puede admitir la siguiente lista de tipos:

 bool, int, float, string, array, object, iterable, self, parent any class or interface name ?type // where "type" may be any of the above 

Tenga en cuenta que el tipo primario puede usarse en clases y no necesita tener un primario consistente con el parámetro y el tipo de retorno.

Además, tenga en cuenta que nulo y invocable no son compatibles. Se eliminó el vacío porque no era útil y tenía una semántica poco clara; Llamable , porque su comportamiento dependía del contexto.

Veamos algunos ejemplos más.

Aquí hay una clase, escrita para PHP 7.3:

 class User { /** @var int $id */ private $id; /** @var string $name */ private $name; public function __construct(int $id, string $name) { $this->id = $id; $this->name = $name; } public function getId(): int { return $this->id; } public function setId(int $id): void { $this->id = $id; } public function getName(): string { return $this->name; } public function setName(string $name): void { $this->name = $name; } } 

En PHP 7.4, sin sacrificar ningún tipo de seguridad, ahora se puede escribir una clase tan simple como:

 class User { public int $id; public string $name; public function __construct(int $id, string $name) { $this->id = $id; $this->name = $name; } } 

Aquí hay algunos ejemplos de todos los tipos que 7.4 ahora admite:

 class Example { public int $scalarType; protected ClassName $classType; private ?ClassName $nullableClassType; // Types are also legal on static properties public static iterable $staticProp; // Types can also be used with the "var" notation var bool $flag; // Typed properties may have default values (more below) public string $str = "foo"; public ?string $nullableStr = null; // The type applies to all properties in one declaration public float $x, $y; // equivalent to: public float $x; public float $y; } 

Funciones de flecha 2.0


Las funciones anónimas en PHP tienden a ser verbales y largas, incluso cuando solo realizan operaciones simples. Esto se debe en parte a una gran cantidad de repeticiones sintácticas, y en parte a la necesidad de importar manualmente las variables utilizadas.

Esto hace que el código que usa cierres simples sea confuso de leer e incluso más difícil de entender.

Veamos un código que usarías con PHP 7.3:

 function array_values_from_keys($arr, $keys) { return array_map(function ($x) use ($arr) { return $arr[$x]; }, $keys); } 

Ahora, aquí está la sintaxis más concisa de PHP 7.4:

 function array_values_from_keys($arr, $keys) { return array_map(fn($x) => $arr[$x], $keys); } 

Por lo tanto, las funciones de flecha ahora tienen esta forma simple:

 fn(parameter_list) => expr 

A continuación puede ver un ejemplo de dos funciones $ fn1 (7.3) y $ fn2 (7.4) una al lado de la otra. Tienen el mismo resultado pero se ven diferentes:

 $y = 1; $fn1 = fn($x) => $x + $y; $fn2 = function ($x) use ($y) { return $x + $y; }; 

Esto también funcionará si las funciones de flecha están anidadas:

 $z = 1; $fn = fn($x) => fn($y) => $x * $y + $z; 

Aquí la función externa captura $ z . Entonces, la función interna también captura $ z de la función externa. Con 7.4, el alcance externo puede estar disponible en la función interna. Esto es algo que 7.3 no pudo hacer.

La sintaxis de la función de flecha permite una variedad de funciones, como variables, valores predeterminados, parámetros y tipos de retorno, así como el paso y retorno por referencia. Todo mientras mantiene un aspecto limpio y legible. A continuación se muestran todas las funciones de flecha válidas ahora disponibles:

 fn(array $x) => $x; fn(): int => $x; fn($x = 42) => $x; fn(&$x) => $x; fn&($x) => $x; fn($x, ...$rest) => $rest; 

Una cosa a tener en cuenta es que las funciones de flecha tienen la prioridad más baja. Mira el ejemplo:

 fn($x) => $x + $y // is fn($x) => ($x + $y) // not (fn($x) => $x) + $y 

Depreciaciones


Hay muchas degradaciones que suceden con la fusión a 7.4. La siguiente lista es una breve descripción de las funciones destinadas a la degradación. Puede encontrar una explicación más detallada aquí :

  • El tipo real
  • Legado de citas mágicas
  • array_key_exists () con objetos
  • Filtro FILTER_SANITIZE_MAGIC_QUOTES
  • Métodos export export ()
  • mb_strrpos () con codificación como tercer argumento
  • mezcla de orden de parámetro implode ()
  • Desligar $ this de cierres no estáticos
  • función hebrevc ()
  • función convert_cyr_string ()
  • función money_format ()
  • función ezmlm_hash ()
  • Función estore_include_path ()
  • allow_url_include ini directiv

Algunos importantes a tener en cuenta son las siguientes degradaciones de dos pasos.

Cambiar la precedencia de un operador de concatenación


Actualmente, la precedencia de los operadores '.', '+' Y '-' son todos iguales. Cualquier combinación de estos operadores simplemente se resolverá de izquierda a derecha.

Veamos este código en PHP 7.3:

 echo "sum: " . $a + $b; // would be evaluated left-to-right echo ("sum: " . $a) + $b; // could also look like this 

Con PHP 7.4, '+' y '-' tendrían prioridad sobre '.' entonces las sumas y restas siempre se realizarían antes de la cadena. Esto se vería así:

 echo "sum: " . $a + $b; // would be executed as if the code were as follows. echo "sum :" . ($a + $b); 

Esta propuesta de dos pasos pretende ser menos propensa a errores y más instintiva. PHP 7.4 actualmente se encuentra en la primera etapa con un aviso de desaprobación de expresiones sin paréntesis de '+', '-' y '.' Mientras espera que ocurra el voto / cambio final en PHP 8.

Operador ternario asociativo de izquierda


A diferencia de la mayoría de los otros lenguajes, el operador ternario en PHP es asociativo a la izquierda en lugar de asociativo a la derecha. No solo es poco común, también es confuso para los programadores que cambian entre diferentes idiomas. PHP 7.4 propone eliminar la asociatividad izquierda y requiere el uso de paréntesis en su lugar.

Echemos un vistazo al código a continuación:

 return $a == 1 ? 'one' : $a == 2 ? 'two' : $a == 3 ? 'three' : $a == 4 ? 'four' : 'other'; 

En la mayoría de los otros idiomas se interpretaría como:

 return $a == 1 ? 'one' : ($a == 2 ? 'two' : ($a == 3 ? 'three' : ($a == 4 ? 'four' : 'other'))) 

Mientras que en PHP, se interpreta como:

 return ((($a == 1 ? 'one' : $a == 2) ? 'two' : $a == 3) ? 'three' : $a == 4) ? 'four' : 'other'; 

Esto puede conducir a errores porque generalmente no es lo que se pretendía.

A través de una propuesta separada de dos pasos, PHP 7.4 ha implementado el uso explícito de paréntesis como advertencia de desaprobación y, con suerte, llevará a cabo un error de tiempo de ejecución de compilación en futuras versiones.

Conclusión


Justo a tiempo para las vacaciones, PHP 7.4 trae nuevas características y mejoras en la calidad de vida para todos los desarrolladores de PHP.

Los sitios web de WordPress definitivamente se beneficiarán de estas mejoras y sus usuarios pueden esperar tiempos de ejecución más rápidos y menos uso de memoria cuando usan PHP 7.4 en comparación con versiones anteriores.

Con la adición de declaraciones de tipo de propiedad de primera clase y sugerencias de tipo, funciones de combinación de flechas y una velocidad ridículamente mejor, el 7.4 seguramente mejorará tanto la velocidad como la calidad de su flujo de trabajo.

Source: https://habr.com/ru/post/483128/


All Articles