Saltar al contenido
Closer Marketing

Novedosas funcionalidades en PHP 8.1: funcionalidades y actualizaciones

No hace mucho, PHP 8.0 fue lanzado con bastante estruendos. Trae muchas peculiaridades novedosas, novedades de rendimiento y cambios; uno de los más apasionantes es el nuevo compilador JIT.

El planeta de la tecnología está en constante evolución, exactamente la misma PHP.

PHP 8.1 se lanzará pronto e incluye múltiples características interesantes. Debería mostrarse el 25 de noviembre de 2021 este año.

En este artículo, detallaremos las novedosas especificaciones de PHP 8.1. Los discutimos en aspecto, desde nuevas funciones y mejoras de desempeño hasta cambios y rechazos importantes.

¡Estarse inmovil!

Novedosas funciones en PHP 8.1

Primero presentaremos todas y cada una de las nuevas peculiaridades de PHP 8.1. Esta es una gran lista.

Comentario: Conforme se aproxima la fecha de publicación de PHP 8.1, esta lista puede medrar o reducirse. Procuramos mantenerlo actualizado.


¡PHP 8.1 ahora prácticamente está aquí! 🎉 Comprueba lo que tiene dentro esta guía detallada ⬇️Lleve a cabo click para twittear

Género de intersección pura

PHP 8.1 agregó soporte para géneros de intersecciones. Es afín a los modelos de conexión introducidos en PHP 8.0, pero para lo que se emplean, ocurre lo opuesto.

Para comprender mejor su uso, veamos de qué manera funciona la declaración de tipos en PHP.

Básicamente, puede agregar parámetros de tipo a parámetros de función, valores de retorno y atributos de clase. Esta labor se denomina mecanografía y garantiza que el valor sea del tipo acertado cuando se invoca. De lo contrario, TypeError se emite instantaneamente. Esto, por su parte, puede ayudar a depurar mejor el código.

Sin embargo, un tipo de notificación tiene sus límites. Los modelos de unión ayudan a resolver este inconveniente al reportar valores para múltiples tipos, y la entrada debe cumplir por lo menos con uno de los tipos informados.

Por otro lado, el RFC detalla el género de intersección de la próxima manera:

El «género de intersección» requiere que el valor satisfaga múltiples limitaciones de tipo, no una.

… El género de intersección puro se define a través de la sintaxis T1 & T2 & … y se puede usar en todas las ubicaciones del tipo aprobado en la actualidad …

Presta atención al empleo & (Y) operador para señalar el género de cirugía; al contrario, utilizamos | El operador (OR) señala el género de conexión.

La utilización de la mayor parte de los tipos estándar en tipos de intersección da como resultado tipos que jamás se pueden satisfacer (como enteros y cadenas). En consecuencia, el género de corte solo puede contener el género de clase (o sea, la interfaz y el nombre de la clase).

El siguiente es un caso de muestra del uso de un género de intersección:

class A 
    private Traversable&Countable $countableIterator;
 
    public function setIterator(Traversable&Countable $countableIterator): void 
        $this->countableIterator = $countableIterator;
    
 
    public function getIterator(): Traversable&Countable 
        return $this->countableIterator;
    

El código anterior define una variable Iterador calculado Como dos géneros de intersección: Puede ser conducido con calculadoEn un caso así, los dos tipos informados son interfaces.

El género de intersección también se ajusta a las reglas de variación estándar de PHP utilizadas en la verificación y restauración de tipos. Sin embargo, hay 2 reglas auxiliares para la interacción de tipos de intersección con subtipos. Puede leer más sobre la regla de separación del tipo de intersección en su RFC.

En ciertos idiomas de programación, puede combinar géneros de unión y unión en exactamente el mismo mensaje. Pero PHP 8.1 lo prohíbe. Por ende, su implementación se conoce como un tipo de cirugía «pura». Sin embargo, el RFC relata que está «reservado para uso futuro».

enumerar

PHP 8.1 al final añadió soporte para la catalogación (también popular como designaciones o tipos enumerados). Son tipos de datos definidos por el usuario que constan de un conjunto de valores posibles.

Los ejemplos de catalogación más habituales en lenguajes de programación son Valor booleano Redactar y true con false 2 valores probables. Es tan común que se apoya en varios lenguajes de programación modernos.

Según el RFC, la lista de PHP se restringe inicialmente a la «lista de entidades»:

La llegada de esta RFC se restringe a la «lista de unidades», esto es, la enumeración en sí es un valor y no una sintaxis fina de constantes primitivas sencillos y no tiene dentro ninguna otra información relevante. Esta función amplía de enorme manera la compatibilidad con el modelado de datos, las definiciones de tipos personalizados y las operaciones de estilo mónada. La lista permite técnicas de modelado que «hacen que los estados erróneos no se midan», lo que da como resultado un código más sólido sin pruebas exhaustivas.

Para llegar a este punto, el equipo de PHP estudió varios lenguajes que ya son compatibles con la lista. Su investigación mostró que puede dividir las listas en tres categorías primordiales: permanentes erradas, objetos fallidos y géneros de datos algebraicos terminados (ADT). ¡Esta es una lectura interesante!

PHP incorpora la lista «Fancy Objects» y planea expandirla a una FINADA completa más adelante. Imita las clases enumerados por Swift, Rust y Kotlin, tanto conceptual como semánticamente, si bien no imita directamente a ninguno de ellos.

RFC utiliza la famosa comparación de colores en una baraja de cartas para argumentar cómo marcha:

enum Suit 
  case Hearts;
  case Diamonds;
  case Clubs;
  case Spades;

está eso aquí Cuadrar La lista define 4 valores probables: corazón, diamante, sociedad, con palaPuede usar estos valores de forma directa utilizando la próxima sintaxis: Suit::Hearts, Suit::Diamonds, Suit::Clubs, con Suit::Spades.

Este uso puede escucharse familiar pues las listas se basan en categorías y objetos. Se comportan de la misma manera y tienen casi los mismos requisitos. Las asignaciones usan exactamente el mismo espacio de nombres que las categorías, interfaces y propiedades.

La lista previo lleva por nombre Lista limpia.

También puede especificar Catalogación aceptada Si completamente desea concretar un valor correspondiente a un escalar, pero unicamente se puede aceptar un género de enumeración, o int o string (nunca fue).

enum Suit: string 
  case Hearts="H";
  case Diamonds="D";
  case Clubs="C";
  case Spades="S";

Además de esto, cada una de las distintas situaciones que apoyan la enumeración debe tener valores únicos. Y jamás puede confundir viñetas y folletines de soporte.

El RFC también se ocupa de métodos de enumeración, métodos estáticos, permanentes, expresiones estándar, etc. Cubrir todo lo mencionado está fuera del alcance de este producto. Puede conocer todos los resultados positivos de la documentación.

Esta never Género de retorno

PHP 8.1 tiene una exclusiva sugerencia de género de restauración llamada. agregada neverEs realmente útil utilizar funciones que siempre se usan throw o exit.

Según el RFC, la redirección de dirección de Internet siempre y en todo momento está habilitada exit (Directa o de forma indirecta) es un excelente ejemplo de su empleo:

function redirect(string $uri): never 
    header('Location: ' . $uri);
    exit();

 
function redirectToLoginPage(): never 
    redirect('/login');

Una suerte de never-La actividad notificada debe cumplir tres condiciones:

  • No debe return Oraciones bien establecidas.
  • No debe return Afirmaciones establecidas indirectamente (p. Ej. Si algo mas Opinión).
  • Ahí es donde tenemos que iniciar exit Opinión (explícita o implícita).

El ejemplo de redireccionamiento de URL anterior exhibe su uso explícito e implícito never Género de retorno.

Esta never Tipo de retorno y void Género de retorno. Todos se aseguran de que una función o procedimiento no devuelva un valor. Sin embargo, hay una diferencia en la implementación de reglas mucho más estrictas, por ejemplo, una void-La función indicada todavía está bien return No hay un valor evidente, pero no puedes emplearlo. never-Función declarada.

Empleo apoyado en experiencia void Si quiere que PHP siga haciendo la función tras llamar, vayan juntos never Si quieres lo contrario.

Incluso, never Definido como el tipo «debajo», con lo que cualquier procedimiento de la clase informada never No puede «para toda la vida» cambiar el tipo de retorno a otro tipo. No obstante, puede void-Método de notificación never-Procedimiento de notificación

Listas de RFC auténticos never El tipo de retorno es noreturn, Este es un tipo de restauración coincidente con 2 herramientas de análisis estático de PHP (Psalm y PHPStan). Debido a que los autores del Salmo y PHPStan sugirieron esto, mantuvieron su terminología, pero gracias a las convenciones de nomenclatura, el equipo de PHP está trabajando noreturn Comparado never, con never Conviértase en un ganador para siempre, conque siempre y en todo momento sustituya las versiones PHP 8.1+ noreturn con never.

fibra

Históricamente, el código PHP la mayoria de las veces ha sido código sincrónico. La ejecución del código se suspende hasta el momento en que se devuelve el resultado, aun si es una función de Y también / S. Puede imaginarse por qué este proceso puede ralentizar la ejecución del código.

Existen múltiples soluciones de terceros que tienen la posibilidad de superar este obstáculo y aceptar a los programadores redactar código PHP de manera asincrónica, singularmente para Y también / S concurrentes. Algunos ejemplos populares son amphp, ReactPHP y Guzzle.

Sin embargo, no existe una forma convencional de conducir estas situaciones en PHP. Además, procesar código sincrónico y asincrónico en la misma pila de llamadas puede ocasionar otros inconvenientes.

La fibra es la manera en que PHP maneja la concurrencia mediante hilos virtuales (o hilos verdes). Procura cerrar la brecha entre el código síncrono y asincrónico rompiendo las funcionalidades de PHP sin afectar a toda la pila de llamadas.

Es un RFC promesa:

  • Agregue soporte de fibra a PHP.
  • Introduzca una exclusiva clase de fibra y una clase de reflexión correspondiente, ReflectionFiber.
  • Añada las clases de excepción FiberError y FiberSalir para señalar fallos.
  • Las fibras permiten una implementación de E / S transparente y sin óbices de las interfaces existentes (PSR-7, Doctrine ORM, etc.). Esto se origina por que se elimina el objeto de marca de posición (promesa). Por el contrario, las funcionalidades pueden indicar géneros de entrada de E / S en vez de elementos de marcador de posición, que no pueden saber los modelos resueltos porque PHP no admite genéricos.

Las fibras le dejan desarrollar funciones interrumpibles de pila completa de PHP y luego usarlas para llevar a cabo la multitarea colaborativa en PHP. Cuando Fiber detiene toda la pila de rendimiento, puede estar seguro de que el resto de su código no se dañará.

El diagrama ilustra el desarrollo de ejecución de código PHP utilizando fibras.

Para ilustrar la utilización de fibras, el RFC emplea este simple ejemplo:

$fiber = new Fiber(function (): void 
    $value = Fiber::suspend('fiber');
    echo "Value used to sintetiza fiber: ", $value, "n";
);
 
$value = $fiber->start();
 
echo "Value from fiber suspending: ", $value, "n";
 
$fiber->sintetiza('test');

Creó una «fibra» en el código previo y la reveló en el instante con una cadena fiber. Esta echo La declaración sirve como una pista visual para la restauración de la fibra.

Puede obtener el valor de esta cadena de la llamada $fiber->start().

Entonces recupere la fibra empleando la cadena «prueba» devuelta de la llamada Fiber::suspend()La ejecución completa del código genera el siguiente resultado:

Value from fiber suspending: fiber
Value used to sintetiza fiber: test

Este es un ejemplo de un libro de artículo básico sobre fibra PHP en funcionamiento. Este es otro ejemplo de fibras que efectúan siete solicitudes GET asincrónicas.

Sin embargo, la mayor parte de los programadores de PHP nunca procesan fibras directamente. La RFC aun hizo exactamente la misma recomendación:

La fibra es una función avanzada que la mayoría de los clientes no usan de manera directa. Esta función está destinada principalmente a bibliotecarios y autores de marcos para proporcionar bucles de eventos e interfaces de programación asincrónicas. Las fibras permiten que la ejecución de código asíncrono se integre sin inconvenientes en el código síncrono cualquier ocasión sin cambiar la pila de llamadas de la aplicación o añadir código de placa de caldera.

La API de fibra no debe usarse de forma directa en el código de nivel de app. Fibers proporciona una API básica de administración de flujo de bajo nivel para hacer abstracciones de nivel superior y utilizar esos resúmenes en el código de la app.

Dados los beneficios de desempeño, puede esperar que las bibliotecas y los marcos de PHP utilicen esta nueva característica. Va a ser interesante ver cómo introducen fibras en su ecosistema.

Nuevo readonly característica

PHP 8.1 añadido readonly característica. Pueden inicializarse solo una vez en la medida indicada. Una vez que inicializas, no puedes cambiar sus valores, esto lanzará un tiro falla Excepción.

Su RFC dice:

Una especie de Solo lectura Una función se puede inicializar solo una vez y solo desde el área donde se comunica. Cualquier otra especificación o cambio a este atributo resultará en una salvedad.

Ahora, se muestra un caso de muestra de de qué manera usarlo:

class Test 
    public readonly string $kinsta;
 
    public function __construct(string $kinsta) 
        // Legal initialization.
        $this->kinsta = $kinsta;
    

Una vez formateado, jamás podrá volver atrás. La integración de esta función en PHP puede reducir significativamente el código de la placa de la caldera que se usa normalmente para habilitar esta función.

Esta readonly El hosting garantiza una fuerte inmutabilidad tanto dentro como fuera del sala. No importa qué código esté en el medio, llámenos readonly El atributo siempre devuelve el mismo valor.

Sin embargo, use readonly Los atributos tienen la posibilidad de no ser ideales para algunos usos; por poner un ejemplo, solo puede utilizarlos con atributos escritos porque no hay seguro de tipo implícito null Y no puedo readonly.

Asimismo establezca un readonly Las propiedades no hacen que un elemento no cambie readonly Las propiedades contienen exactamente el mismo objeto, pero el objeto en sí se puede modificar.

Otro pequeño inconveniente con esta función es que no se puede clonar. Ahora hay una solución para esta aplicación particular. Compruébelo si es necesario.

definición final Estándar de clase

A partir de PHP 8.0, puede reemplazar las constantes de clase con sus subclases. Esto se debe a la forma en que se incorpora la herencia en PHP.

El siguiente es un caso de muestra de de qué manera omitir un valor estándar informado previamente:

class Moo

    public const M = "moo";

 
class Meow extends Moo

    public const M = "meow";
  

Si las vacas ahora quieren supervisar el accionar de su gato de forma más estricta (por lo menos en concepto de permanentes), tienen la posibilidad de usar las nuevas especificaciones de PHP 8.1 para lograrlo. final Adaptador.

En el momento en que declaras una incesante como final, Significa.

class Moo

    final public const M = "moo";

 
class Meow extends Moo

    public const M = "meow";

 
// Fatal error: Meow::M cannot override final constant Moo::M

Puede leer mucho más sobre esa constante de clase final en PHP RFC.

Nuevo fsync() con fdatasync() función

PHP 8.1 incluye 2 novedosas funciones de sistema de archivos. agregada fsync() con fdatasync()Parecen familiares para quienes están familiarizados a las funciones de Linux del mismo nombre. Esto se origina por que están relacionados y también incorporados solo para PHP.

De hecho, este complemento llega tarde. PHP era entre los pocos idiomas de programación importantes que aún no había introducido fsync () y fdatasync (), es decir, antes de PHP 8.1.

Esta fsync() Funcionalidades afines a las de PHP fflush() Función, pero en un aspecto hay una diferencia importante; no obstante fflush() Adecentar el búfer interno de la aplicación al S.O., fsync() Además de esto, asegúrese de que el búfer de adentro se vacíe en la memoria física. Esto garantiza una escritura completa y continua para que logre proseguir obteniendo información una vez que una app o el sistema se bloqueen.

Este es un ejemplo de su uso.

$doc="kinsta.txt";

$kin = fopen($doc, 'ki');
fwrite($kin, 'doc info');
fwrite($kin, "rn");
fwrite($kin, 'more info');

fsync($kin);
fclose($kin);

Agregar fsync() La última llamada asegura que todos y cada uno de los datos almacenados en el búfer de adentro de PHP o el S.O. se escriban en la memoria. Antes de eso, se evita la ejecución de algún otro código.

Las funcionalidades relacionadas son fdatasync()Úselo para sincronizar datos, pero no siempre metadatos. Si no se requieren datos para los metadatos, esta llamada de función acelera un poco el proceso de escritura.

Sin embargo, tenga presente que PHP 8.1 no lo admite fdatasync() Todo está en Windows; solo actúa como un nick fsync()En un dispositivo POSIX fdatasync() Establecido apropiadamente.

Nuevo array_is_list() función

Las tablas PHP pueden contener claves enteras y de cadena. Esto significa que puede utilizarlos para muchos propósitos, incluidas listas, tablas de resumen, diccionarios, compilaciones, pilas, colas y mucho más. Aun puede envolver matrices dentro de matrices para hacer matrices multidimensionales.

Él puede verificar efectivamente si hay una entrada en particular en la tabla, pero no es tan simple contrastar si faltan transiciones de tabla, claves fuera de orden, etc. En resumen, no se puede contrastar de manera rápida que la tabla sea una lista.

La función array_is_list () comprueba si las claves de la tabla están preparadas en el orden preciso 0, Y no hay escapatoria. Si se cumplen todas las condiciones, se va a devolver truePor defecto, también se restaura true Para matrices vacías.

Ahora se muestran algunos ejemplos de de qué forma se pueden emplear adjuntado con ambos true con false Para cumplir con las condiciones:

// true array_is_list() examples
array_is_list([]); // true
array_is_list([1, 2, 3]); // true
array_is_list(['cats', 2, 3]); // true
array_is_list(['cats', 'dogs']); // true
array_is_list([0 => 'cats', 'dogs']); // true
array_is_list([0 => 'cats', 1 => 'dogs']); // true 

// false array_is_list() examples 
array_is_list([1 => 'cats', 'dogs']); // as first key isn't 0
array_is_list([1 => 'cats', 0 => 'dogs']); // keys are out of order
array_is_list([0 => 'cats', 'bark' => 'dogs']); // non-integer keys
array_is_list([0 => 'cats', 2 => 'dogs']); // gap in between keys 

La lista de tablas PHP con claves fuera de orden es una posible fuente de fallo, use esta función para asegurar un cumplimiento estricto Correr El requisito previo para prolongar el código es una buena adición a PHP.

Novedosas propiedades del sodio XChaCha20

Sodium es una biblioteca de cifrado actualizada y fácil de utilizar para encriptado, descifrado, descentralización de claves de acceso, firma, etcétera. El paquete libsodium de PECL se agrega al contenedor sodio a fin de que los programadores de PHP logren usarlo.

Aun empresas de tecnología líderes como Fb, Discord, Malwarebytes y Valve usan libsodium para mantener a los usuarios seguros con conexiones veloces y seguras.

libsodium acepta el algoritmo de cifrado XChaCha20 para el cifrado y descifrado de datos, en especial para el cifrado de flujo. De manera afín, el complemento PECL-Libsodium ya funciona con XChaCha20, pero solo acepta el código de verificación de mensajes Poly1305.

Muchas aplicaciones PHP usan XChaCha20 de forma directa para codificar la transmisión. Desde PHP 8.1, hay tres novedosas funcionalidades disponibles para facilitar las cosas, lo que le permite cifrar o transcribir datos sin autenticación con XChaCha20. Este estado se denomina «estado separado».

Las nuevas peculiaridades de XChaCha20 son:

  • sodium_crypto_stream_xchacha20_keygen: Devuelve una clave azarosa segura para Natrium_crypto_stream_xchacha20.
  • sodium_crypto_stream_xchacha20: Un flujo de claves que expande una clave y un número aleatorio en bytes pseudoaleatorios.
  • sodium_crypto_stream_xchacha20_xor: Utilice un número y una clave aleatorios (sin autenticación) para cifrar el mensaje.

Además de esto, se han definido 2 novedosas permanentes PHP en el espacio de nombres global:

  • SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES (Cuota 32)
  • SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES (Cuota veinticuatro)

Pero utilícelo con precaución. Gracias a que no existe autenticación, los procesos de descifrado son atacables a los asaltos criptográficos recurrentes.

Puede leer más sobre su empleo y requisitos en la página de GitHub.

Nueva clase IntlDatePatternGenerator

La biblioteca ICU subyacente en PHP admite la creación de formatos de fecha y hora locales, pero no se puede ajustar completamente.

Por poner un ejemplo, si quiere hacer un formato de fecha y hora específico de la zona antes de PHP 8.0, puede hacerlo utilizando el estándar IntlDateFormatter predefinido de 6 formas:

  • IntlDateFormatter::LONG: Durante mucho más tiempo, como p. Ej. 10 de noviembre de 2017 o 11:22:33
  • IntlDateFormatter::MEDIUM: Mucho más corto como 10 de noviembre de 2017
  • IntlDateFormatter::SHORT: Solo números 11 de octubre de 2017 o 11.22

Cada uno tiene su RELATIVE_ De forma alternativa, establece el formato de fecha en un área limitada antes o tras la fecha actual. En PHP, el valor es el dia de ayer, hoy dia, con Mañana.

Por servirnos de un ejemplo, suponga que quiere usar la versión extendida del año y la versión corta del mes. 10/10/2017A partir de PHP 8.0, esto ahora no es posible.

En PHP 8.1+, puede usar el nuevo formato para detallar el formato de fecha, mes y hora Generador de imágenes de fecha internacional Glorioso. Puede dejar el orden exacto de estas piezas al diseñador.

Tenga en cuenta que aunque esta categoría solo contiene esta palabra Fecha Entre ellos, según cuidados intensivos Generador de modelos de fecha y horaAsimismo le permite hacer formatos de hora flexibles; para facilitar la denominación, el equipo de PHP decidió utilizar uno mucho más corto Generador de imágenes de fecha en todo el mundo Semestre.

Este es un caso de muestra directamente de su RFC:

$skeleton = "YYYYMMdd";
 
$today = DateTimeImmutable::createFromFormat('Y-m-d', '2021-04-24');
 
$dtpg = new IntlDatePatternGenerator("de_DE");
$pattern = $dtpg->getBestPattern($skeleton);
echo "de: ", IntlDateFormatter::formatObject($today, $pattern, "de_DE"), "n";
 
$dtpg = new IntlDatePatternGenerator("en_US");
$pattern = $dtpg->getBestPattern($skeleton), "n";
echo "en: ", IntlDateFormatter::formatObject($today, $pattern, "en_US"), "n";
 
/*
de: 24.04.2021
en: 04/24/2021
*/

En el código de arriba esqueleto La variable detalla el formato de fecha u hora a emplear. No obstante, el diseñador se ocupa del orden del resultado final.

Acepta formato de imagen AVIF

El formato del archivo de imagen AVIF o AV1 es un formato de imagen libre de regalías relativamente nuevo basado en el formato de codificación de video AV1. Aparte de una relación de compresión mucho más alta (y por lo tanto un tamaño del archivo más pequeño), asimismo admite múltiples funcionalidades como transparencia, HDR, etcétera.

El formato AVIF solo se estandarizó últimamente (8 de junio de 2021). Esto abrió la puerta a navegadores como Chrome 85+ y Mozilla firefox 86+ para añadir soporte para imágenes AVIF.

El procesamiento de imágenes PHP 8.1 y el complemento GD agregaron soporte para imágenes AVIF.

No obstante, para incluir esta función, debe compilar el complemento GD con soporte AVIF. Para realizar esto, ejecute el siguiente comando.

Debian / Ubuntu:

apt install libavif-dev

Fedora / RHEL:

dnf install libavif-devel

Esto instalará todas las dependencias existentes. Ahora, puede compilar el soporte AVIF corriendo el próximo comando --with-avif Con logotipo ./configure Manuscrito.

./buildconf --force
./configure --enable-gd --with-avif

Si desea empezar desde el comienzo de un nuevo entorno, asimismo puede activar otras extensiones de PHP aquí.

Tras la instalación, puede probar si la compatibilidad con AVIF está habilitada ejecutando el próximo comando en el terminal PHP:

php -i | grep AVIF

Si ha instalado AVIF adecuadamente, va a ver los próximos desenlaces:

AVIF Support => enabled

Asimismo puedes usar gd_info() Llame para obtener una lista de funcionalidades de GD, incluyendo si Soporte AVIF La función está activada.

Esta extensión PHP 8.1 GD actualizada asimismo agrega dos novedosas peculiaridades para conducir imágenes AVIF: imagecreatefromavif con imageavifMarchan del mismo modo que sus contrapartes JPEG y PNG.

Esta imagecreatefromavif Esta función restaura la instancia de GdImage desde la imagen AVIF especificada. A continuación, puede utilizar esta instancia para editar o convertir la imagen.

Segundo imageavif Esta función envía ficheros de imagen AVIF. Por poner un ejemplo, puede emplearlo para convertir JPEG a AVIF:

$image = imagecreatefromjpeg('image.jpeg');
imageavif($image, 'image.avif');

Puede leer mucho más sobre esta novedosa función en la página de GitHub.

Nuevo $_FILES: full_path Clave de descarga de directorio

PHP mantiene una gran cantidad de variables predefinidas para rastrear distintas cosas. Uno es la variable $ _FILES, que contiene elementos de una matriz asociativa cargados a través de el método HTTP POST.

La mayoría de los navegadores modernos aceptan la descarga de directorios terminados mediante el cuadro de envío de ficheros HTML. Aun PHP <8.1 admite esta característica, pero tiene una gran advertencia; no puede cargar una carpeta con una estructura de directorio exacta o una ruta relativa porque PHP no proporciona esta información. avanzando $_FILES En grandes cantidades.

Una nueva característica llamada full_path llegar $_FILES En grandes cantidades. Con esta nueva información, puede guardar rutas relativas al servidor o copiar la estructura exacta del directorio.

Puede probar esta información imprimiendo la siguiente información $FILES Uso de matrices var_dump($_FILES); Mando.

Sin embargo, utilice esta función con precaución. Asegúrese de protegerse de los ataques comunes de descarga de archivos.

Soporte de descifrado de matriz para clave de cadena

PHP 7.4 agregó el uso de un operador de extensión de tabla (Puede ser usado array_merge() Función. Sin embargo, esta función está limitada solo a los sistemas de claves numéricas, porque abrir una cadena de un paquete es inconsistente cuando se combinan tablas con claves duplicadas.

Sin embargo, PHP 8 agregó soporte para parámetros con nombre, lo que elimina esta restricción. Por lo tanto, descomprimir matrices ahora también admite grupos de claves de cadena que contienen la misma sintaxis:

$array = [...$array1, ...$array2];

Este ejemplo de RFC muestra cómo manejar la concatenación de matrices con claves de cadena duplicadas en PHP 8.1:

$array1 = ["a" => 1];
$array2 = ["a" => 2];
$array = ["a" => 0, ...$array1, ...$array2];
var_dump($array); // ["a" => 2]

Aquí, la clave de cadena «a» aparece tres veces antes de descomprimir y combinar la matriz. Pero solo su último valor pertenece $array2 ganar.

Una representación clara de los números octales

PHP admite una variedad de sistemas numéricos, incluidos decimal (base 10), binario (base 2), octal (base 8) y hexadecimal (base 16). El sistema numérico decimal es el predeterminado.

Si desea utilizar un sistema de numeración diferente, deberá agregar un prefijo regular a cada número:

  • Hexadecimal: 0x Prefijo. (Ej. 17 = 0x11)
  • Binario: 0b Prefijo. (Ejemplo 3 = 0b11)
  • Octal: 0 Prefijo. (Ej. 9 = 011)

Puede ver cómo el prefijo de un sistema de números octales difiere de los prefijos de otros sistemas. Para estandarizar este problema, muchos lenguajes de programación han agregado soporte para símbolos de números octales específicos: 0o o 0O.

A partir de PHP 8.1, puede escribir el ejemplo anterior (es decir, número 9 y base 10) en el sistema de números octales 0o11 o 0O11.

0o16 === 14; // true
0o123 === 83; // true
 
0O16 === 14; // true
0O123 === 83; // true
 
016 === 0o16; // true
016 === 0O16; // true

Además, esta nueva característica también se aplica al guión bajo del separador de texto numérico que se introdujo en PHP 7.4.

Lea más sobre esta nueva característica de PHP 8.1 en su RFC.

Soporte para el algoritmo de compresión MurmurHash3 y xxHash

PHP 8.1 agregó soporte para MurmurHash3 y xxHash para algoritmos hash. No están diseñados para fines criptográficos, pero aún ofrecen una impresionante aleatoriedad, dispersión y singularidad de salida.

Estos nuevos algoritmos hash son más rápidos que la mayoría de los algoritmos hash actuales para PHP. De hecho, algunas de estas variaciones del algoritmo hash son más rápidas que el rendimiento de la RAM.

Porque PHP 8.1 también brinda soporte para reportar ciertos algoritmos $options Parámetros, puede hacer lo mismo con estos nuevos algoritmos. El valor predeterminado para este nuevo parámetro es []Por lo tanto, no afecta ninguna de nuestras actividades de descentralización actuales.

Puede leer más sobre estas nuevas características de PHP 8.1 en su página de GitHub: MurmurHash3, xxHash, $ opciones específicas del algoritmo.

Compatibilidad con DNS sobre HTTPS (DoH)

DNS sobre HTTPS (DoH) es un protocolo para una solución DNS sobre el protocolo HTTPS. Con HTTPS, DoH cifra los datos entre el cliente y el solucionador de DNS y mejora la privacidad y seguridad del usuario al prevenir ataques de intermediarios.

A partir de PHP 8.1, puede configurar el complemento curl para configurar un servidor DoH; debe estar compilado con PHP rizado Versión 7.62+. Para la mayoría de los principales sistemas operativos (incluidas las distribuciones de Linux) esto no es un problema, ya que normalmente incluyen Curl 7.68+.

Puede especificarlo ingresando la URL del servidor DoH CURLOPT_DOH_URL Ajustes.

$doh = curl_init('https://kinsta.com');
curl_setopt($doh, CURLOPT_DOH_URL, 'https://dns.google/dns-query');
curl_exec($doh);

En el ejemplo anterior, usamos el servidor DNS público de Google. También tenga en cuenta que usamos https:// En todas las URL utilizadas. Asegúrese de configurarlo por completo, ya que Curl no tiene un servidor DNS predeterminado al que regresar.

También puede seleccionar la lista de servidores DoH públicos incluidos en el documento Curl.

Además, la referencia CURLOPT_DOH_URL en la documentación de Curl explica el uso completo de los distintos parámetros.

Utilice el archivo CURLStringFile para cargar el archivo desde la cadena

El complemento PHP Curl admite solicitudes HTTP (S) al descargar archivos Archivo curl Para lograr esto, la clase acepta el URI o la ruta del archivo, el tipo MIME y el nombre del archivo final.

Sin embargo, con Archivo curl Categoría, solo puede aceptar la ruta del archivo o URI, no el contenido del archivo en sí. Si ha descargado archivos a la memoria (por ejemplo, imágenes procesadas, documentos XML, archivos PDF), debe data:// URI con codificación Base64.

pero rizado Se admite una forma más sencilla de aceptar el contenido del archivo Archivo de cadena curl La clase apoya esto.

Puede leer más sobre cómo se implementó en PHP 8.1 en la página de GitHub.

Nuevo MYSQLI_REFRESH_REPLICA continuamente

PHP 8.1 mysqli La extensión agrega una nueva constante llamada. adicional MYSQLI_REFRESH_REPLICACorresponde al existente MYSQLI_REFRESH_SLAVE continuamente.

Este cambio fue positivo en MySQL 8.0.23 para abordar la sensibilidad racial en el vocabulario técnico (los ejemplos más comunes son «esclavo» y «maestro»).

Tenga en cuenta que las constantes antiguas no se eliminan ni deshabilitan. Los desarrolladores y las aplicaciones aún pueden usarlo. Para los desarrolladores y las empresas que buscan renunciar a tales condiciones, este nuevo estándar es solo una opción.

Utilice el almacenamiento en caché hereditario para mejorar el rendimiento

El almacenamiento en caché de herencia es una característica nueva en opcache que puede eliminar la sobrecarga de la herencia de clases PHP.

Las clases de PHP se compilan y almacenan en caché por separado usando opcache. Sin embargo, están vinculados a cada solicitud mientras se ejecutan. Este proceso puede incluir varias comprobaciones de compatibilidad y métodos / atributos / constantes de cotización para secciones y propiedades.

Por lo tanto, aunque el resultado de cada solicitud es el mismo, aún lleva mucho tiempo completarlo.

Herede todas las categorías dependientes individuales (secciones, interfaces, propiedades, tipos de atributos, métodos) del enlace de caché y almacene los resultados en la memoria compartida en caché. Debido a que esto solo ocurre una vez, el legado requiere menos orientación.

También elimina las restricciones de las clases de constantes, por ejemplo, B. Constantes no resueltas, atributos escritos y verificación de tipos de covarianza. Por lo tanto, todas las clases almacenadas en el opcache no se modifican, lo que reduce aún más el número de comandos necesarios.

En general, se esperan ganancias significativas en el desempeño. El escritor de parches Dimitry Stogov dijo que era un 8 por ciento mejor que el básico «¡Hola, mundo!» Sinfonía. Programa. No podemos esperar para probarlo en nuestros puntos de referencia de PHP a continuación.

La primera clase se llama sintaxis

PHP 8.1 agregó una sintaxis llamada de última generación para reemplazar la codificación existente con cadenas y matrices, además de una creación más limpia terminaciónEsta nueva gramática también está disponible con herramientas de análisis estático y se respeta el alcance del anuncio.

A continuación, se muestran algunos ejemplos de RFC:

$fn = Closure::fromCallable('strlen');
$fn = strlen(...);
 
$fn = Closure::fromCallable([$this, 'method']);
$fn = $this->method(...)
 
$fn = Closure::fromCallable([Foo::class, 'method']);
$fn = Foo::method(...);

Aquí todos y cada uno de los pares de frases son iguales. Tres en punto () La sintaxis es similar al parámetro (...$args). Además de esto, los parámetros aún no se han cumplido.

Cambios en PHP 8.1

PHP 8.1 también incluye cambios en su sintaxis y funcionalidad actuales. Vamos a discutirlos:

Requerido para shell PHP amigable Línea de lectura desplazarse

Php Línea de lectura El complemento habilita funciones de shell interactivas como navegación, autocompletar, edición, etc. Aunque está incluido en PHP, no está habilitado predeterminado.

Puede usar la CLI de PHP para acceder al shell PHP amigable -a Opciones de la línea de comandos:

php -a

Interactive shell

php >
php > echo "Hello";
Hello
php > function test() {
php { echo "Hello";
php  
php > test();
Hello

Antes de PHP 8.1, aun sin Línea de lectura Complemento habilitado. Las funcionalidades interactivas del shell no funcionaron como se suponía, como resultado -a Las opciones son poco relevantes.

Si no permite el complemento Readline en PHP 8.1 CLI, el shell amigable mostrará un mensaje de fallo completo.

php -a
Interactive shell (-a) requires the readline extension.

El estado de error ya establecido de MySQLi se establece en anormal

Antes de PHP 8.1, MySQLi utilizaba fallos silenciosos de forma predeterminada. Esta acción normalmente provoca que su código no siga un riguroso manejo de fallos / excepciones. Los desarrolladores deben implementar sus funcionalidades concretas de manejo de fallos.

PHP 8.1 cambió este accionar estableciendo el modo perfecto de informe de errores predeterminado de MySQLi para generar salvedades.

Fatal error: Uncaught mysqli_sql_exception: Connection refused in ...:...

Ya que este es un gran avance, debe usar la versión de PHP <8.1 mysqli_report Ejecútelos antes de conectarse por vez primera a MySQLi, o puede hacer lo mismo corriendo un valor de informe de fallo mysqli_driver Ejemplo.

El RFC prosigue cambios afines introducidos en PHP 8.0.

Sufijos de línea personalizables para escritura CSV

Antes de PHP 8.1, la función de escritura CSV integrada en PHP, fputcsv con SplFileObject::fputcsv, Codificado de manera recia para la inserción n (O salto de línea) al final de cada línea.

PHP 8.1 acepta un nuevo factor llamado. adicional eol Sobre estas funcionalidades. Puede emplearlo para pasar caracteres configurables al final de una línea; todavía lo utiliza por defecto n Características. Por consiguiente, aún puede usarlo en el código existente.

Las reglas de escape habituales se aplican al empleo de caracteres al final de una línea. Si quieres emplear r, no rn Como caracteres EOL, debe encerrarlos entre comillas.

Esta es la página de GitHub que sigue a este nuevo cambio.

Nuevo version_compare Limitaciones del operador

Php version_compare() La función equipara 2 cadenas con números de versión. Esta función admite un tercer parámetro opcional operator Pon a prueba ciertas relaciones.

Aunque no se indica explícitamente en la documentación, antes de PHP 8.1 puede entablar este factor en un valor de parte (p. Ej. g, l, n) Sin errores.

PHP 8.1 agrega limitaciones mucho más estrictas version_compare() función operator Argumentos para superar esta situación. Los únicos operadores que puede emplear actualmente son:

  • ==, =, con Igualada
  • ! =, <>, con Nació
  • > con Tonelaje bruto
  • > = con Dar
  • < con eso
  • <= con Esta

Los valores parciales del operador ya no existen.

En este momento use las funciones de codificación y decodificación HTML ENT_QUOTES | ENT_SUBSTITUTE

Las entidades HTML son representaciones textuales de caracteres; en caso contrario, se interpretan en formato HTML; piensa en semejantes señales < con > Se emplea para detallar etiquetas HTML (p. Ej. ,

,

Deja una respuesta

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