Novedades de PHP 8.1: funciones, cambios, mejoras y más
PHP 8.0 se lanzó con gran fanfarria no hace mucho. Trajo muchas características nuevas, mejoras de rendimiento y cambios, el más emocionante de los cuales fue el nuevo compilador JIT.
El mundo de la tecnología siempre avanza, y lo mismo ocurre con PHP.
PHP 8.1 ya casi está aquí, repleto de varias características interesantes. Está programado para lanzarse a finales de este año, el 25 de noviembre de 2021.
En este artículo, cubriremos en detalle las novedades de PHP 8.1. Desde sus nuevas funciones y mejoras de rendimiento hasta cambios significativos y obsolescencias, los analizaremos en profundidad.
¡Estarse quieto!
Nuevas funciones en PHP 8.1
Comencemos cubriendo todas las características nuevas de PHP 8.1. Es una gran lista.
Nota: Esta lista puede crecer o reducirse a medida que se acerca la fecha de lanzamiento de PHP 8.1. Intentaremos mantenerlo actualizado.
Tipos de intersección pura
PHP 8.1 agrega soporte para tipos de intersección. Es similar a los tipos de unión introducidos en PHP 8.0, pero su uso previsto es exactamente lo contrario.
Para comprender mejor su uso, actualice cómo funcionan las declaraciones de tipos en PHP.
Esencialmente, puede agregar declaraciones de tipo a argumentos de función, valores de retorno y propiedades de clase. Esta asignación se denomina sugerencia de tipo y garantiza que el valor sea del tipo correcto en el momento de la llamada. De lo contrario, arroja un TypeError de inmediato. A su vez, esto le ayuda a depurar mejor el código.
Sin embargo, declarar un solo tipo tiene sus limitaciones. Los tipos de unión lo ayudan a superar eso al permitirle declarar un valor con múltiples tipos, y la entrada debe satisfacer al menos uno de los tipos declarados.
Por otro lado, el RFC describe los tipos de intersección como:
Un «tipo de intersección» requiere un valor para satisfacer múltiples restricciones de tipo en lugar de una sola.
… los tipos de intersección puros se especifican usando la sintaxis T1 & T2 & … y se pueden usar en todas las posiciones donde los tipos se aceptan actualmente …
Tenga en cuenta el uso de & (Y) operador para declarar tipos de intersección. Por el contrario, utilizamos el | (OR) operador para declarar tipos de unión.
El uso de la mayoría de los tipos estándar en un tipo de intersección dará como resultado un tipo que nunca se puede cumplir (por ejemplo, entero y cadena). Por lo tanto, los tipos de intersección solo pueden incluir tipos de clases (es decir, interfaces y nombres de clases).
A continuación, se muestra un código de ejemplo de cómo puede utilizar los tipos 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;
}
}
En el código anterior, hemos definido una variable counttableIterator como una intersección de dos tipos: Transitable y Contable. En este caso, los dos tipos declarados son interfaces.
Los tipos de intersección también se ajustan a las reglas de variación estándar de PHP que ya se utilizan para la verificación de tipos y la herencia. Pero hay dos reglas adicionales sobre cómo los tipos de intersección interactúan con el subtipo. Puede leer más sobre las reglas de variación de los tipos de intersección en su RFC.
En algunos lenguajes de programación, puede combinar tipos de unión y tipos de intersección en la misma declaración. Pero PHP 8.1 lo prohíbe. Por lo tanto, su implementación se denomina tipos de intersección «puros». Sin embargo, la RFC sí menciona que «se deja como un alcance futuro».
Enumeraciones
PHP 8.1 finalmente está agregando soporte para enumeraciones (también llamadas enumeraciones o tipos enumerados). Son un tipo de datos definido por el usuario que consta de un conjunto de valores posibles.
El ejemplo de enumeraciones más común en lenguajes de programación es el booleano tipo, con true y false como dos valores posibles. Es tan común que está integrado en muchos lenguajes de programación modernos.
Según el RFC, las enumeraciones en PHP se limitarán a «enumeraciones de unidades» al principio:
El alcance de esta RFC se limita a «enumeraciones de unidades», es decir, enumeraciones que son en sí mismas un valor, en lugar de simplemente una sintaxis elegante para una constante primitiva, y no incluyen información adicional asociada. Esta capacidad ofrece un soporte enormemente ampliado para el modelado de datos, las definiciones de tipos personalizadas y el comportamiento de estilo mónada. Las enumeraciones permiten la técnica de modelado de «hacer que los estados no válidos no sean representables», lo que conduce a un código más robusto con menos necesidad de pruebas exhaustivas.
Para llegar a esta etapa, el equipo de PHP estudió muchos lenguajes que ya admiten enumeraciones. Su encuesta encontró que puede categorizar enumeraciones en tres grupos generales: Constantes de fantasía, Objetos de fantasía y Tipos de datos algebraicos completos (ADT). ¡Es una lectura interesante!
PHP implementa enumeraciones «Fancy Objects», con planes para extenderlo a ADT completos en el futuro. Está modelado conceptual y semánticamente a partir de tipos enumerados en Swift, Rust y Kotlin, aunque no está modelado directamente en ninguno de ellos.
El RFC usa la famosa analogía de los palos en una baraja de cartas para explicar cómo funcionará:
enum Suit {
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
Aquí el Traje enum define cuatro valores posibles: Corazones, Diamantes, Clubs, y Espadas. Puede acceder a estos valores directamente usando la sintaxis: Suit::Hearts, Suit::Diamonds, Suit::Clubs, y Suit::Spades.
Este uso puede parecer familiar, ya que las enumeraciones se construyen sobre clases y objetos. Se comportan de manera similar y tienen casi los requisitos exactos. Las enumeraciones comparten los mismos espacios de nombres que las clases, las interfaces y los rasgos.
Las enumeraciones mencionadas anteriormente se llaman Enums puros.
También puedes definir Enums respaldados si desea dar un valor escalar equivalente a cualquier caso. Sin embargo, las enumeraciones respaldadas solo pueden tener un tipo, ya sea int o string (nunca ambos).
enum Suit: string {
case Hearts="H";
case Diamonds="D";
case Clubs="C";
case Spades="S";
}
Además, todos los casos diferentes de una enumeración respaldada deben tener un valor único. Y nunca puedes mezclar enumeraciones puras y respaldadas.
El RFC profundiza más en los métodos de enumeración, métodos estáticos, constantes, expresiones constantes y mucho más. Cubrirlos todos está más allá del alcance de este artículo. Puede consultar la documentación para familiarizarse con todas sus bondades.
los never Tipo de retorno
PHP 8.1 agrega una nueva sugerencia de tipo de retorno llamada never. Es muy útil usarlo en funciones que siempre throw o exit.
Según su RFC, las funciones de redireccionamiento de URL que siempre exit (explícita o implícitamente) son un buen ejemplo de su uso:
function redirect(string $uri): never {
header('Location: ' . $uri);
exit();
}
function redirectToLoginPage(): never {
redirect('/login');
}
A never-la función declarada debe satisfacer tres condiciones:
- No debería tener el
returndeclaración definida explícitamente. - No debería tener el
returndeclaración definida implícitamente (p. ej. si-si no declaraciones). - Debe terminar su ejecución con un
exitdeclaración (explícita o implícitamente).
El ejemplo de redirección de URL anterior muestra el uso explícito e implícito de la never tipo de retorno.
los never tipo de retorno comparte muchas similitudes con el void tipo de retorno. Ambos se aseguran de que la función o el método no devuelva un valor. Sin embargo, se diferencia por hacer cumplir reglas más estrictas. Por ejemplo, un void-la función declarada todavía puede return sin un valor explícito, pero no puede hacer lo mismo con un never-función declarada.
Como regla general, vaya con void cuando espera que PHP continúe ejecutándose después de la llamada a la función. Ir con never cuando quieres lo contrario.
Es más, never se define como un tipo «inferior». Por lo tanto, cualquier método de clase declarado never «nunca» puede cambiar su tipo de retorno a otra cosa. Sin embargo, puede extender un void-método declarado con un never-método declarado.
El RFC original enumera los never tipo de retorno como noreturn, que era un tipo de retorno que ya era compatible con dos herramientas de análisis estático de PHP, a saber, Psalm y PHPStan. Como esto fue propuesto por los propios autores de Psalm y PHPStan, mantuvieron su terminología. Sin embargo, debido a las convenciones de nomenclatura, el equipo de PHP realizó una encuesta para noreturn vs never, con never emergiendo como el ganador para siempre. Por lo tanto, para las versiones de PHP 8.1+, sustituya siempre noreturn con never.
Fibras
Históricamente, el código PHP casi siempre ha sido código sincrónico. La ejecución del código se detiene hasta que se devuelve el resultado, incluso para las operaciones de E / S. Puede imaginarse por qué este proceso puede hacer que la ejecución del código sea más lenta.
Existen múltiples soluciones de terceros para superar este obstáculo y permitir a los desarrolladores escribir código PHP de forma asincrónica, especialmente para operaciones de E / S simultáneas. Algunos ejemplos populares incluyen amphp, ReactPHP y Guzzle.
Sin embargo, no existe una forma estándar de manejar tales instancias en PHP. Además, el tratamiento de código sincrónico y asincrónico en la misma pila de llamadas conduce a otros problemas.
Las fibras son la forma en que PHP maneja el paralelismo a través de hilos virtuales (o hilos verdes). Busca eliminar la diferencia entre código síncrono y asincrónico al permitir que las funciones PHP se interrumpan sin afectar a toda la pila de llamadas.
Esto es lo que el RFC promesas:
- Añadiendo soporte para Fibras a PHP.
- Presentamos una nueva clase de fibra y la correspondiente clase de reflexión ReflectionFiber.
- Añadiendo clases de excepción FiberError y FiberSalir para representar errores.
- Las fibras permiten implementaciones de E / S transparentes sin bloqueo de interfaces existentes (PSR-7, Doctrine ORM, etc.). Eso es porque se elimina el objeto de marcador de posición (promesa). En cambio, las funciones pueden declarar el tipo de resultado de E / S en lugar de un objeto marcador de posición que no puede especificar un tipo de resolución porque PHP no admite genéricos.
Puede usar Fibers para desarrollar funciones PHP interrumpibles de pila completa, que luego puede usar para implementar la multitarea cooperativa en PHP. A medida que Fibers pausa toda la pila de ejecución, puede estar seguro de que no dañará el resto de su código.
Gráfico que ilustra el flujo de ejecución de código PHP con Fibers.
Para ilustrar el uso de Fibers, su RFC usa este simple ejemplo:
$fiber = new Fiber(function (): void {
$value = Fiber::suspend('fiber');
echo "Value used to resume fiber: ", $value, "n";
});
$value = $fiber->start();
echo "Value from fiber suspending: ", $value, "n";
$fiber->resume('test');
Estás creando una «fibra» en el código anterior e inmediatamente la suspendes con la cadena fiber. los echo La declaración sirve como una señal visual para la reanudación de la fibra.
Puede recuperar este valor de cadena de la llamada a $fiber->start().
Luego, reanuda la fibra con la cadena «prueba», que se devuelve de la llamada a Fiber::suspend(). La ejecución completa del código da como resultado una salida que dice:
Value from fiber suspending: fiber
Value used to resume fiber: test
Ese es el ejemplo básico del libro de texto PHP Fibers en el trabajo. Aquí hay otro ejemplo de Fibers de realizar siete solicitudes GET asincrónicas.
Habiendo dicho y hecho todo, la mayoría de los desarrolladores de PHP nunca tratarán directamente con Fibers. Y el RFC incluso sugiere lo mismo:
Las fibras son una característica avanzada que la mayoría de los usuarios no usarán directamente. Esta función está dirigida principalmente a los autores de bibliotecas y marcos para proporcionar un bucle de eventos y una API de programación asincrónica. Las fibras permiten integrar la ejecución de código asincrónico sin problemas en el código sincrónico en cualquier punto sin la necesidad de modificar la pila de llamadas de la aplicación o agregar código repetitivo.
No se espera que la API de fibra se use directamente en el código de nivel de aplicación. Las fibras proporcionan una API básica de control de flujo de bajo nivel para crear abstracciones de nivel superior que luego se utilizan en el código de la aplicación.
Teniendo en cuenta sus beneficios de rendimiento, puede esperar que las bibliotecas y los marcos de PHP aprovechen esta nueva característica. Será interesante ver cómo implementan Fibers dentro de su ecosistema.
Nuevo readonly Propiedades
PHP 8.1 agrega soporte para readonly propiedades. Solo se pueden inicializar una vez desde el ámbito donde están declarados. Una vez inicializado, no puede modificar su valor nunca. Hacerlo arrojaría un Error excepción.
Su RFC dice:
A solo lectura La propiedad solo se puede inicializar una vez, y solo desde el ámbito donde se ha declarado. Cualquier otra cesión o modificación de la propiedad resultará en una excepción de Error.
Aquí tienes un ejemplo de cómo puedes usarlo:
class Test {
public readonly string $kinsta;
public function __construct(string $kinsta) {
// Legal initialization.
$this->kinsta = $kinsta;
}
}
Una vez inicializado, no hay vuelta atrás. Tener esta característica incorporada en PHP reduce en gran medida el código repetitivo que se usa a menudo para habilitar esta funcionalidad.
los readonly La propiedad ofrece una fuerte garantía de inmutabilidad, tanto dentro como fuera de la clase. No importa qué código se ejecute en el medio. Llamando a un readonly propiedad siempre devolverá el mismo valor.
Sin embargo, usando el readonly La propiedad puede no ser ideal en casos de uso específicos. Por ejemplo, solo puede usarlos junto con una propiedad con tipo porque las declaraciones sin un tipo son implícitamente null y no puede ser readonly.
Además, establecer un readonly la propiedad no hace que los objetos sean inmutables. los readonly La propiedad contendrá el mismo objeto, pero ese objeto en sí puede cambiar.
Otro problema menor con esta propiedad es que no se puede clonar. Ya existe una solución para este caso de uso particular. Míralo si es necesario.
Definir final Constantes de clase
A partir de PHP 8.0, puede anular las constantes de clase con sus clases secundarias. Se debe a la forma en que se implementa la herencia en PHP.
A continuación, se muestra un ejemplo de cómo puede anular el valor de una constante previamente declarada:
class Moo
{
public const M = "moo";
}
class Meow extends Moo
{
public const M = "meow";
}
Ahora, si las vacas quieren ser más estrictas con la forma en que se comportan los gatos (al menos con constantes), pueden hacerlo con el nuevo PHP 8.1. final modificador.
Una vez que haya declarado una constante como final, esto significa que.
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 más sobre esto en las constantes de clase final PHP RFC.
Nuevo fsync() y fdatasync() Funciones
PHP 8.1 agrega dos nuevas funciones del sistema de archivos llamadas fsync() y fdatasync(). Le resultarán familiares a quienes estén acostumbrados a las funciones de Linux del mismo nombre. Eso es porque están relacionados, simplemente implementados para PHP.
De hecho, esta adición se ha retrasado mucho. PHP es uno de los pocos lenguajes de programación importantes que todavía no implementó fsync () y fdatasync (), es decir, hasta PHP 8.1.
los fsync() la función es similar a la existente de PHP fflush() función, pero difiere significativamente de una manera. Mientras que fflush() vacía los búferes internos de la aplicación en el sistema operativo, fsync() va un paso más allá y garantiza que los búferes internos se vacíen en el almacenamiento físico. Eso garantiza una escritura completa y persistente para que pueda recuperar datos incluso después de una falla de la aplicación o del sistema.
Aquí tienes un ejemplo de cómo puedes usarlo.
$doc="kinsta.txt";
$kin = fopen($doc, 'ki');
fwrite($kin, 'doc info');
fwrite($kin, "rn");
fwrite($kin, 'more info');
fsync($kin);
fclose($kin);
Añadiendo el fsync() la llamada al final asegura que cualquier dato contenido en PHP o en el búfer interno del sistema operativo se escriba en el almacenamiento. Todas las demás ejecuciones de código están bloqueadas hasta entonces.
Su función relacionada es fdatasync(). Úselo para sincronizar datos pero no necesariamente metadatos. Para los datos cuyos metadatos no son esenciales, esta llamada de función hace que el proceso de escritura sea un poco más rápido.
Sin embargo, debe tener en cuenta que PHP 8.1 no es compatible fdatasync() completamente en Windows todavía. Simplemente actúa como un alias de fsync(). En POSIX, fdatasync() está correctamente implementado.
Nuevo array_is_list() Función
Las matrices de PHP pueden contener claves tanto enteras como de cadena. Eso significa que puede usarlos para varias cosas, incluidas listas, tablas hash, diccionarios, colecciones, pilas, colas y mucho más. Incluso puede tener matrices dentro de matrices, creando matrices multidimensionales.
Puede verificar de manera eficiente si una entrada en particular es una matriz, pero no es tan fácil verificar si falta alguna compensación de matriz, claves fuera de orden, etc. En resumen, no puede verificar rápidamente si una matriz es una lista.
La función array_is_list () comprueba si las claves de una matriz están en orden secuencial a partir de 0y sin huecos. Si se cumplen todas las condiciones, volverá true. Por defecto, también devuelve true para matrices vacías.
Aquí hay algunos ejemplos de su uso con ambos true y false condiciones cumplidas:
// 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
Una lista de matrices de PHP con claves desordenadas es una fuente potencial de errores. El uso de esta función para hacer cumplir estrictamente lista requisitos antes de seguir adelante con la ejecución del código es una gran adición a PHP.
Nuevas funciones de sodio XChaCha20
Sodium es una biblioteca criptográfica moderna y fácil de usar para cifrado, descifrado, hash de contraseñas, firmas y más. El paquete libsodium de PECL agrega un contenedor para Sodium para que los desarrolladores de PHP puedan usarlo.
Incluso las empresas tecnológicas líderes como Facebook, Discord, Malwarebytes y Valve utilizan libsodium para proteger a sus usuarios con conexiones rápidas y seguras.
libsodium admite el algoritmo de cifrado XChaCha20 para cifrar y descifrar datos, especialmente para el cifrado de transmisión. Asimismo, la extensión libsodium de PECL ya es compatible con XChaCha20, pero solo con el código de autenticación de mensajes Poly1305.
Muchas aplicaciones PHP utilizan XChaCha20 directamente para el cifrado de transmisiones. Para facilitar las cosas, comenzando con PHP 8.1, tendrá tres nuevas funciones para cifrar o descifrar datos con XChaCha20 sin necesidad de autenticación. Este modo se denomina «modo independiente».
Las funciones de XChaCha20 recientemente introducidas son:
sodium_crypto_stream_xchacha20_keygen: Devuelve una clave aleatoria segura para usar con sodium_crypto_stream_xchacha20.sodium_crypto_stream_xchacha20: Expande la clave y el nonce en un flujo de claves de bytes pseudoaleatorios.sodium_crypto_stream_xchacha20_xor: Encripta un mensaje usando un nonce y una clave secreta (sin autenticación).
Además, hay dos nuevas constantes PHP definidas en el espacio de nombres global:
SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES(asignado 32)SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES(asignado 24)
Úselo con precaución. Ya que es sin autenticación, la operación de descifrado es vulnerable a los ataques comunes de texto cifrado.
Puede leer más sobre su uso y requisitos en la página de GitHub.
Nueva clase IntlDatePatternGenerator
La biblioteca ICU subyacente de PHP admite la creación de formatos de fecha y hora localizados, pero no es completamente personalizable.
Por ejemplo, si desea crear formatos de hora y datos específicos de la configuración regional hasta PHP 8.0, puede usar la constante IntlDateFormatter predefinida para hacerlo de 6 maneras:
IntlDateFormatter::LONG: Más largo, como el 10 de noviembre, 2017 o 11:22:33 pmIntlDateFormatter::MEDIUM: Un poco más corto, como el 10 de noviembre., 2017IntlDateFormatter::SHORT: Solo numérico, como 11/10/17 o 11:22 pm
Cada uno de estos también tiene su propio RELATIVE_ variantes, que establece el formato de fecha dentro de un rango limitado antes o después de la fecha actual. En PHP, los valores son el dia de ayer, hoy dia, y mañana.
Supongamos que desea utilizar la versión larga para el año y la versión corta para el mes, como 10/11/2017. A partir de PHP 8.0, no puede hacerlo.
En PHP 8.1+, puede especificar qué formatos usar para la fecha, mes y hora con el nuevo IntlDatePatternGenerator clase. Puede dejar el orden exacto de estos componentes al formateador.
Debe tener en cuenta que, si bien esta clase solo tiene la palabra Fecha en él, es consistente con la UCI DateTimePatternGenerator. Eso significa que también puede usarlo para crear formatos de hora flexibles. Para simplificar la nomenclatura, el equipo de PHP ha optado por el método más corto. IntlDatePatternGenerator término.
Aquí hay un ejemplo 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 anterior, el esqueleto La variable define los formatos de fecha u hora particulares que se utilizarán. Sin embargo, el formateador maneja el orden del resultado final.
Soporte para formato de imagen AVIF
AVIF, o formato de archivo de imagen AV1, es un formato de imagen libre de regalías relativamente nuevo basado en el formato de codificación de video AV1. Además de ofrecer una mayor compresión (y, por lo tanto, tamaños de archivo más pequeños), también admite varias funciones como transparencia, HDR y más.
El formato AVIF solo se estandarizó recientemente (8 de junio de 2021). Eso ha allanado el camino para los navegadores, como Chrome 85+ y Firefox 86+, agregando soporte para imágenes AVIF.
El procesamiento de imágenes de PHP 8.1 y la extensión GD agregan soporte para imágenes AVIF.
Sin embargo, para incluir esta funcionalidad, debe compilar la extensión GD con soporte AVIF. Puede hacerlo ejecutando los siguientes comandos.
Para Debian / Ubuntu:
apt install libavif-dev
Para Fedora / RHEL:
dnf install libavif-devel
Eso instalará todas las dependencias más recientes. A continuación, puede compilar el soporte AVIF ejecutando el --with-avif bandera con el ./configure texto.
./buildconf --force
./configure --enable-gd --with-avif
Si está iniciando un nuevo entorno desde cero, también puede habilitar otras extensiones de PHP aquí.
Una vez instalado, puede probar si la compatibilidad con AVIF está habilitada ejecutando el siguiente comando en su terminal PHP:
php -i | grep AVIF
Si ha instalado AVIF correctamente, verá el siguiente resultado:
AVIF Support => enabled
También puede utilizar el gd_info() llamar para recuperar una lista de funciones de GD, incluyendo si Soporte AVIF la funcionalidad está habilitada.
Esta extensión PHP 8.1 GD actualizada también agrega dos nuevas funciones para trabajar con imágenes AVIF: imagecreatefromavif y imageavif. Funcionan de manera similar a sus contrapartes JPEG y PNG.
los imagecreatefromavif La función devuelve una instancia de GdImage de una imagen AVIF determinada. A continuación, puede utilizar esta instancia para editar o convertir la imagen.
El otro imageavif La función genera el archivo de imagen AVIF. Por ejemplo, puede usarlo para convertir un JPEG a AVIF:
$image = imagecreatefromjpeg('image.jpeg');
imageavif($image, 'image.avif');
Puede leer más sobre esta nueva función en su página de GitHub.
Nuevo $_FILES: full_path Clave para cargas de directorio
PHP mantiene una gran cantidad de variables predefinidas para rastrear varias cosas. Uno de ellos es la variable $ _FILES que contiene una matriz asociativa de elementos cargados mediante el método HTTP POST.
La mayoría de los navegadores modernos admiten la carga de un directorio completo con campos de carga de archivos HTML. Incluso PHP $_FILES formación.
Eso cambia en PHP 8.1 con la adición de una nueva clave llamada full_path al $_FILES formación. Con estos nuevos datos, puede almacenar rutas relativas o duplicar la estructura de directorios exacta en el servidor.
Puede probar esta información generando el $FILES matriz usando el var_dump($_FILES); mando.
Sin embargo, proceda con precaución si está utilizando esta función. Asegúrese de protegerse contra los ataques estándar de carga de archivos.
Soporte de desempaquetado de matrices para matrices con clave de cadena
PHP 7.4 agregó soporte para el desempaquetado de matrices con el operador de extensión de matrices (…). Actúa como una alternativa más rápida al uso de array_merge() función. Sin embargo, esta función se limitaba a las matrices de claves numéricas, ya que al desempaquetar matrices de claves de cadena se producían conflictos al fusionar matrices con claves duplicadas.
Sin embargo, PHP 8 agregó soporte para argumentos con nombre, eliminando esta limitación. Por lo tanto, el desempaquetado de matrices ahora también admitirá matrices con clave de cadena utilizando la misma sintaxis:
$array = [...$array1, ...$array2];
Este ejemplo de RFC ilustra cómo se maneja la combinació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 fusionarse mediante el desempaquetado de la matriz. Pero solo su último valor perteneciente a $array2 gana.
Notación numérica octal explícita
PHP admite varios sistemas numéricos, incluidos decimal (base-10), binario (base-2), octal (base-8) y hexadecimal (base-16). El sistema de numeración decimal es el predeterminado.
Si desea utilizar cualquier otro sistema numérico, deberá anteponer a cada número un prefijo estándar:
- Maleficio:
0xprefijo. (por ejemplo, 17 =0x11) - Binario:
0bprefijo. (por ejemplo, 3 =0b11) - Octal:
0prefijo. (por ejemplo, 9 =011)
Puede ver cómo el prefijo del sistema de numeración octal varía del resto. Para estandarizar esta preocupación, muchos lenguajes de programación están agregando soporte para una notación numérica octal explícita: 0o o 0O.
Comenzando con PHP 8.1, puede escribir el ejemplo que se muestra arriba (es decir, el número 9 en base 10) en el sistema numérico octal como 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 funciona con el separador literal numérico de subrayado introducido en PHP 7.4.
Lea más sobre esta nueva característica de PHP 8.1 en su RFC.
Compatibilidad con los algoritmos MurmurHash3 y xxHash Hash
PHP 8.1 agrega soporte para los algoritmos de hash MurmurHash3 y xxHash. No están diseñados para uso criptográfico, pero aún brindan una impresionante aleatoriedad, dispersión y singularidad de salida.
Estos nuevos algoritmos de hash son más rápidos que la mayoría de los algoritmos de hash existentes de PHP. De hecho, algunas de estas variantes de algoritmos hash son más rápidas que el rendimiento de la RAM.
Como PHP 8.1 también agrega soporte para declarar algoritmos específicos $options parámetros, puede hacer lo mismo con estos nuevos algoritmos. El valor predeterminado de este nuevo argumento es []. Por lo tanto, no afectará a ninguna de nuestras funciones hash existentes.
Puede leer más sobre estas nuevas características de PHP 8.1 en sus páginas de GitHub: MurmurHash3, xxHash, $ opciones específicas de algoritmo.
Compatibilidad con DNS sobre HTTPS (DoH)
DNS sobre HTTPS (DoH) es un protocolo para la resolución de DNS a través del protocolo HTTPS. Al utilizar HTTPS para cifrar los datos entre el cliente y el sistema de resolución de DNS, DoH aumenta la privacidad y la seguridad del usuario al evitar los ataques MitM.
A partir de PHP 8.1, puede usar la extensión Curl para especificar un servidor DoH. Requiere que PHP se compile con libcurl 7.62+ versiones. Eso no es un problema para los sistemas operativos más populares, incluidas las distribuciones de Linux, ya que a menudo incluyen Curl 7.68+.
Puede configurar la URL del servidor DoH especificando el CURLOPT_DOH_URL opción.
$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. Además, tenga en cuenta el uso de https:// en todas las URL utilizadas. Asegúrese de configurar esto perfectamente, ya que no hay un servidor DNS predeterminado al que recurrir en Curl.
También puede elegir de una lista de servidores DoH públicos incluidos en la documentación de Curl.
Además, la referencia CURLOPT_DOH_URL de la documentación de Curl explica cómo usar sus diversos argumentos minuciosamente.
Carga de archivos desde cadenas con CURLStringFile
La extensión PHP Curl admite solicitudes HTTP (S) con carga de archivos. Utiliza el CURLFile class para lograr esto, que acepta un URI o una ruta de archivo, un tipo mime y el nombre del archivo final.
Sin embargo, con el CURLFile class, solo puede aceptar la ruta del archivo o URI, pero no el contenido del archivo en sí. En los casos en los que ya tenía el archivo cargado en la memoria (por ejemplo, imágenes procesadas, documentos XML, PDF), tenía que usar data:// URI con codificación Base64.
Pero libcurl ya admite una forma más sencilla de aceptar el contenido del archivo. El nuevo CURLStringFile class agrega soporte precisamente para eso.
Puede leer su página de GitHub para obtener más información sobre cómo se implementa en PHP 8.1.
Nuevo MYSQLI_REFRESH_REPLICA Constante
PHP 8.1 mysqli la extensión agrega una nueva constante llamada MYSQLI_REFRESH_REPLICA. Es equivalente al existente MYSQLI_REFRESH_SLAVE constante.
Este cambio fue bienvenido en MySQL 8.0.23 para abordar la insensibilidad racial en el vocabulario tecnológico (los ejemplos más comunes incluyen «esclavo» y «maestro»).
Debe tener en cuenta que la constante anterior no se eliminará ni se desaprobará. Los desarrolladores y las aplicaciones pueden seguir usándolo. Esta nueva constante no es más que una opción para desarrolladores y empresas que deseen dejar atrás dicha terminología.
Mejoras de rendimiento con caché de herencia
Inheritance Cache es una nueva adición a opcache que elimina la sobrecarga de herencia de clases PHP.
Las clases de PHP son compiladas y almacenadas en caché por opcache por separado. Sin embargo, ya están vinculados en tiempo de ejecución en cada solicitud. Este proceso puede implicar varias comprobaciones de compatibilidad y tomar prestados métodos / propiedades / constantes de clases y rasgos principales.
Como resultado, esto lleva un tiempo considerable para ejecutarse, aunque el resultado es el mismo para cada solicitud.
La caché de herencia vincula todas las clases dependientes únicas (padre, interfaces, rasgos, tipos de propiedad, métodos) y almacena los resultados en la memoria compartida de opcache. Como esto sucede ahora solo una vez, la herencia requiere instrucciones menores.
Además, elimina las limitaciones de las clases inmutables, como las constantes no resueltas, las propiedades escritas y las comprobaciones de tipos covariantes. Por lo tanto, todas las clases almacenadas en opcache son inmutables, lo que reduce aún más el número de instrucciones necesarias.
Con todo, promete importantes beneficios de rendimiento. Dimitry Stogov, el autor de este parche, descubrió que mostraba una mejora del 8% en la base Symfony «Hello, World!» programa. No podemos esperar para probarlo en nuestros siguientes puntos de referencia de PHP.
Sintaxis invocable de primera clase
PHP 8.1 agrega una sintaxis invocable de primera clase para reemplazar las codificaciones existentes mediante cadenas y matrices. Además de crear un limpiador Cierre, esta nueva sintaxis también es accesible mediante herramientas de análisis estático y respeta el alcance declarado.
Aquí hay algunos ejemplos tomados del 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 los pares de expresiones son equivalentes. El triple punto (…) la sintaxis es similar a la sintaxis de descompresión de argumentos (...$args). Excepto aquí, los argumentos aún no se han completado.
Cambios en PHP 8.1
PHP 8.1 también incluye cambios en su sintaxis y características existentes. Vamos a discutirlos:
PHP Interactive Shell requiere readline Extensión
PHP readline La extensión habilita funciones de shell interactivas como navegación, autocompletado, edición y más. Si bien está incluido con PHP, no está habilitado de forma predeterminada.
Puede acceder al shell interactivo de PHP utilizando CLI de PHP -a opción de 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, podía abrir el shell interactivo usando PHP CLI incluso sin el readline extensión habilitada. Como era de esperar, las funciones interactivas del shell no funcionaron, lo que -a opción sin sentido.
En PHP 8.1 CLI, el shell interactivo sale con un mensaje de error si no ha habilitado la extensión readline.
php -a
Interactive shell (-a) requires the readline extension.
Modo de error predeterminado de MySQLi establecido en Excepciones
Antes de PHP 8.1, MySQLi por defecto silenciaba los errores. Este comportamiento a menudo conducía a un código que no seguía un manejo estricto de errores / excepciones. Los desarrolladores tuvieron que implementar sus propias funciones explícitas de manejo de errores.
PHP 8.1 cambia este comportamiento configurando el modo de informe de errores predeterminado de MySQLi para lanzar una excepción.
Fatal error: Uncaught mysqli_sql_exception: Connection refused in ...:...
Como se trata de un cambio importante, para las versiones PHP mysqli_report función antes de realizar la primera conexión MySQLi. Alternativamente, puede hacer lo mismo seleccionando el valor de informe de errores creando una instancia mysqli_driver ejemplo.
El RFC sigue un cambio similar introducido en PHP 8.0.
Finales de línea personalizables para funciones de escritura CSV
Antes de PHP 8.1, las funciones de escritura CSV integradas de PHP, fputcsv y SplFileObject::fputcsv, fueron codificados para agregar n (o el carácter de avance de línea) al final de cada línea.
PHP 8.1 agrega soporte para un nuevo parámetro llamado eol a estas funciones. Puede usarlo para pasar un carácter configurable de final de línea. Por defecto, todavía usa el n personaje. Entonces, puede continuar usándolo en su código existente.
Se aplican reglas de escape de caracteres estándar para el uso de caracteres de final de línea. Si quieres usar r, n, o rn como caracteres EOL, debe encerrarlos entre comillas dobles.
Aquí está la página de GitHub que rastrea este nuevo cambio.
Nuevo version_compare Restricciones del operador
PHP version_compare() La función compara dos cadenas de números de versión. Esta función acepta un tercer argumento opcional llamado operator para probar una relación en particular.
Aunque no se trata explícitamente en la documentación, antes de PHP 8.1, podía establecer este parámetro en un valor parcial (p. Ej. g, l, n) sin enfrentarse a un error.
PHP 8.1 agrega restricciones más estrictas a la version_compare() la función operator argumento para superar esta situación. Los únicos operadores que puede utilizar ahora son:
- ==, =, y eq
- ! =, , y nordeste
- > y gt
- > = y ge
- y es
- y le
No más valores de operador parciales.
Funciones de codificación y decodificación HTML ahora en uso ENT_QUOTES | ENT_SUBSTITUTE
Las entidades HTML son representaciones textuales de caracteres que de otro modo se interpretarían como HTML. Piense en personajes como < y > utilizado para definir etiquetas HTML (p. ej. <a>, <h3>, <script>).
La entidad HTML para < es & lt; (menor que el símbolo) y > es & gt; (símbolo mayor que).
Nota: Quite el espacio entre «&» y «amp».
Puede utilizar estas entidades HTML de forma segura en un documento HTML sin activar el motor de renderizado del navegador.
Por ejemplo, & lt;script& gt; se mostrará como <script> en el navegador, en lugar de ser interpretado como una etiqueta HTML.
Antes de PHP 8.1, las funciones htmlspecialchars () y htmlentities () convertían símbolos como ", <, >, y & a sus respectivas entidades HTML. Pero no convirtieron el carácter de comillas simples (') a su entidad HTML de forma predeterminada. Además, devolvieron una cadena vacía si había un UTF-8 con formato incorrecto en el texto.
En PHP 8.1., Estas funciones de codificación y decodificación HTML (y sus funciones relacionadas) también convertirán los caracteres de comillas simples a su entidad HTML de forma predeterminada.
Y si el texto dado tiene caracteres no válidos, las funciones los sustituirán por un carácter de sustitución Unicode ( ) en lugar de devolver una cadena vacía. PHP 8.1 logra esto cambiando las firmas de estas funciones a ENT_QUOTES | ENT_SUBSTITUTE en vez de ENT_COMPAT por defecto.
La mayoría de los marcos ya usan ENT_QUOTES como valor de marca predeterminado. Por lo tanto, no verá mucha diferencia debido a este cambio. Sin embargo, el nuevo ENT_SUBSTITUTE flag no es tan ampliamente utilizado. PHP 8.1 hará que los caracteres UTF-8 no válidos se sustituyan por el carácter en lugar de devolver una cadena vacía.
Advertencia sobre ilegal compacto Llamadas a funciones
PHP compact() La función es muy útil. Puede usarlo para crear una matriz con variables usando sus nombres y valores.
Por ejemplo, considere el siguiente código:
$animal="Cat";
$sound = 'Meow';
$region = 'Istanbul';
compact('animal', 'sound', 'region');
// ['animal' => "Cat", 'sound' => "Meow", 'region' => "Istanbul"]
La documentación de la función compacta indica que solo aceptará parámetros de cadena o valores de matriz con valores de cadena. Sin embargo, antes de PHP 7.3, cualquier las cadenas que no están configuradas se omitirán silenciosamente.
PHP 7.3 modificó el compact() función para lanzar un aviso si usa variables indefinidas. PHP 8.1 va un paso más allá y lanza una advertencia.
Puede leer su página de GitHub para comprender cómo se produjo este cambio.
Nuevas migraciones de recursos a objetos de clase
Uno de los objetivos a largo plazo de PHP es alejarse de los recursos hacia objetos de clase estándar.
Por razones históricas, los objetos de recursos se utilizan ampliamente en aplicaciones PHP. Por lo tanto, la migración de recursos a objetos de clase debe ser lo menos disruptiva posible. PHP 8.1 migra cinco de estos recursos:
los file_info Recurso migrado a finfo Objetos
La clase finfo de PHP ofrece una interfaz orientada a objetos para el fileinfo funciones. Sin embargo, usando finfo devoluciones de funciones resource objetos con el file_info tipo en lugar de una instancia del finfo clase en sí.
PHP 8.1 corrige esta anomalía.
Recursos IMAP migrados a IMAPConnection Objetos de clase
En consonancia con el objetivo de migración de recursos a objetos, el nuevo IMAPConnection La clase minimiza los posibles cambios importantes cuando PHP eventualmente modifica los detalles de implementación de la clase.
Esta nueva clase también se declara final, entonces no tienes permitido extend eso.
Lea más sobre su implementación en su página de GitHub.
Los recursos de conexión FTP están ahora FTPConnection Objetos de clase
En PHP ftp_connect() o ftp_ssl_connect() funciones, obtendrías una recurso objeto de tipo ftp.
PHP 8.1 agrega el nuevo FTPConnection clase para rectificar eso. Y como con el IMAPConnection clase, también se declara final para evitar que se extienda.
Lea más sobre su implementación en su página de GitHub.
Identificadores de fuentes migrados a GdFont Objetos de clase
La extensión GD de PHP proporciona la función imageloadfont () para cargar un mapa de bits definido por el usuario y devolver su ID de recurso identificador de fuente (un número entero).
En PHP 8.1, esta función devolverá un GdFont instancia de clase. Además, para que la migración sea sencilla, todas las funciones que aceptaban previamente un ID de recurso de imageloadfont() ahora tomará el nuevo GdFont objetos de clase.
Lea más sobre esta migración en su página de GitHub.
Recursos LDAP migrados a objetos
LDAP, o Protocolo ligero de acceso a directorios, se utiliza para acceder a los «Servidores de directorio». Como una estructura de directorio de disco duro, es una base de datos única que contiene datos en una estructura de árbol.
PHP incluye una extensión LDAP que aceptó o devolvió recurso objetos antes de PHP 8.1. Sin embargo, ahora todos han migrado sin problemas a nuevas instancias de clases. los recurso los tipos que han sido transferidos son:
ldap linkrecurso paraLDAPConnectionobjeto de claseldap resultrecurso paraLDAPResultobjeto de claseldap result entryrecurso paraLDAPResultEntryobjeto de clase
Revise su página de GitHub para comprender mejor esta migración.
Los recursos de Pspell ahora son objetos de clase
La extensión Pspell de PHP le permite verificar la ortografía y las sugerencias de palabras.
PHP pspell y pspell config tipos de objeto de recurso con un identificador de número entero. Estos dos objetos de recursos ahora se reemplazan con PSpellDictionary y PSpellConfig objetos de clase.
Al igual que las migraciones anteriores, todas las funciones de Pspell que previamente aceptaron o devolvieron identificadores de objetos de recursos tomarán las nuevas instancias de objetos de clase.
Consulte su página de GitHub para obtener más información.
Desaprovechamientos en PHP 8.1
PHP 8.1 desaprueba muchas de sus características anteriores. La siguiente lista proporciona una breve descripción general de las funcionalidades que PHP 8.1 desaprueba:
No puedo pasar null a parámetros de función interna no anulables
A partir de PHP 8.0, sus funciones internas aceptan silenciosamente null valores incluso para argumentos que no aceptan valores NULL. No ocurre lo mismo con las funciones definidas por el usuario, solo aceptan null para argumentos que aceptan valores NULL.
Por ejemplo, considere este uso:
var_dump(str_contains("foobar", null));
// bool(true)
Aquí el null El valor se convierte silenciosamente en una cadena vacía. Por lo tanto, el resultado devuelve true.
Este RFC tiene como objetivo sincronizar el comportamiento de las funciones internas lanzando una advertencia de obsolescencia en PHP 8.1.
var_dump(str_contains("foobar", null));
// Deprecated: Passing null to argument of type string is deprecated
La desaprobación se convertirá en un TypeError en la próxima versión principal de PHP (es decir, PHP> = 9.0), haciendo que el comportamiento de las funciones internas sea consistente con las funciones definidas por el usuario.
Restringido $GLOBALS Uso
PHP $GLOBALS La variable proporciona una referencia directa a su tabla de símbolos interna. Admitir esta funcionalidad es complejo y afecta el rendimiento de las operaciones de la matriz. Además, rara vez se usaba.
Según el RFC, modificando indirectamente $GLOBALS ya no está permitido. Este cambio es incompatible con versiones anteriores.
El impacto de este cambio es relativamente bajo:
En los mejores paquetes de compositores de 2k que encontré 23 casos que usan $ GLOBALS sin desreferenciarlo directamente. Según una inspección superficial, solo hay dos casos en los que $ GLOBALES no se utiliza de forma de solo lectura.
Sin embargo, el uso de solo lectura de $GLOBALS sigue funcionando como de costumbre. Lo que ya no se admite es escribir en $GLOBALS como un todo. Como resultado, puede esperar un ligero aumento de rendimiento, especialmente cuando se trabaja con matrices PHP normales.
Declaraciones de tipo de retorno para funciones internas
PHP 8.0 permitió a los desarrolladores declarar parámetros y tipos de retorno para la mayoría de las funciones y métodos internos. Fue posible gracias a varios RFC, como errores de tipo constante para funciones internas, tipos de unión 2.0 y tipos mixtos v2.
Sin embargo, hay muchos casos en los que puede faltar información de tipo. Algunos de ellos incluyen un tipo con recursos, fuera parámetros de paso por referencia, tipo de retorno de métodos no finales y funciones o métodos que no analizan los parámetros de acuerdo con las reglas generales. Puede leer los detalles exactos en su RFC.
Esta RFC solo aborda el problema con el tipo de devolución de los métodos no finales. Sin embargo, en lugar de eliminarlo por completo de inmediato, el equipo de PHP proporciona una ruta de migración gradual para actualizar sus bases de código con los tipos de retorno de métodos relevantes.
Los tipos de retorno de métodos internos no finales, cuando es posible, se declaran provisionalmente en PHP 8.1 y se harán cumplir en PHP 9.0. Significa que en las versiones de PHP 8.x, se genera un aviso de “desaprobación” durante las verificaciones de herencia cuando se anula un método interno de manera que los tipos de retorno son incompatibles, y PHP 9.0 los convertirá en un error fatal.
Si ve este aviso de obsolescencia después de actualizar a PHP 8.1, asegúrese de actualizar los tipos de retorno de sus métodos.
Interfaz serializable obsoleta
PHP 7.4 introdujo el mecanismo de serialización de objetos personalizados con dos nuevos métodos mágicos: __serialize() y __unserialize(). Estos nuevos métodos tienen como objetivo reemplazar los Serializable interfaz eventualmente.
Este RFC propone finalizar esa decisión mediante la elaboración de un plan para la eventual eliminación de Serializable.
En PHP 8.1, si implementa el Serializable interfaz sin implementar __serialize() y __unserialize() métodos, PHP lanzará una advertencia «En desuso».
Deprecated: The Serializable interface is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary) in ... on line ...
Si estas apoyando PHP y PHP> = 7.4, debe implementar tanto el Serializable interfaz y los nuevos métodos mágicos. Sobre PHP> = 7.4 versiones, los métodos mágicos tendrán prioridad.
No compatible float para int Conversiones obsoletas
PHP es un lenguaje escrito dinámicamente. Como tal, hay muchos casos en los que la coerción de tipo ocurre naturalmente. La mayoría de estas coacciones son inofensivas y muy convenientes.
Sin embargo, cuando un flotador número se convierte en un entero, a menudo implica la pérdida de datos. Por ejemplo, cuando el flotador 3,14 se convierte en un número entero 3, pierde su valor fraccionario.
Lo mismo sucede cuando el flotante está fuera del rango de enteros de la plataforma, o cuando una cadena flotante se convierte en un entero.
PHP 8.1 rectifica este comportamiento y trae su coerción de tipo dinámico más en línea con la mayoría de los lenguajes de programación modernos. El objetivo es hacer que tales coacciones sean predecibles e intuitivas.
En PHP 8.1, verá un aviso de obsolescencia cuando no sea compatible flotador está implícitamente coaccionado a un En t. Pero, ¿qué constituye un flotador compatible con números enteros? los RFC responde esto:
Se dice que un flotante es compatible con números enteros si posee las siguientes características:
- Es un número (es decir, no NaN o Infinity)
- Está dentro del rango de un entero de PHP (depende de la plataforma)
- No tiene parte fraccionaria
Este aviso de obsolescencia se actualizará a un Error de tecleado en la próxima versión principal de PHP (es decir, PHP 9.0).
los mysqli::get_client_info Método y mysqli_get_client_info($param) Obsoleto
La API del cliente MySQL define dos constantes: client_info (una cuerda) y client_version (un int). El controlador nativo de MySQL (MySQLnd) es parte de la fuente oficial de PHP y vincula estas constantes a la versión de PHP. En libmysql, representan la versión de la biblioteca cliente en el momento de la compilación.
Antes de PHP 8.1, mysqli exponía estas constantes de 4 formas: mysqli_driver propiedades, mysqli properties, mysqli_get_client_info() función, y mysqli::get_client_info método. Sin embargo, no hay un método para client_version.
MySQLnd expone estas constantes de 2 formas a PHP: una constante y una llamada a función. Para unificar los métodos de acceso de mysqli con estas mismas dos opciones, PHP 8.1 está desaprobando estas otras dos opciones:
get_client_infométodo en el mysqli clase. En su lugar, puede usar elmysqli_get_client_info()función.mysqli_get_client_info()función con parámetros. Llame a la función sin ningún parámetro para evitar el aviso de obsolescencia.
Lea más sobre esta desaprobación en su página de GitHub.
Todos mhash*() Las funciones (extensión hash) están obsoletas
PHP 5.3 integrado mhash*() funciones en ext/hash como capa de compatibilidad para ext/mhash. Más tarde, PHP 7.0 eliminado ext/mhash.
A diferencia del hash_*() funciones, el mhash*() las funciones no siempre están disponibles. Debe habilitarlos por separado mientras configura PHP.
En PHP 7.4, la extensión hash se incluía junto con PHP, lo que la convierte en una extensión predeterminada para PHP. Sin embargo, todavía admitía habilitar la --enable-mhash opción por razones de compatibilidad.
El equipo de PHP ha decidido desaprobar las funciones mhash * () en PHP 8.1 y eliminarlas por completo en PHP 9.0. Las funciones en desuso son mhash(), mhash_keygen_s2k(), mhash_count(), mhash_get_block_size() y mhash_get_hash_name(). Puedes usar el estándar ext/hash funcionalidad en lugar de ellos.
Ambos filter.default y filter.default_options Configuración de INI obsoleta
PHP filter.default La configuración INI le permite aplicar un filtro a todos los superglobales de PHP, es decir, datos GPCRS ($_GET, $_POST, $_COOKIE, $_REQUEST, y $_SERVER).
Por ejemplo, puede configurar filter.default=magic_quotes o filter.default=add_slashes (basado en la versión de PHP) para resucitar la controvertida e insegura función de citas mágicas de PHP (eliminada en PHP 5.4).
los filter.default La configuración INI proporciona una funcionalidad adicional al permitir muchos más filtros, lo que lo empeora aún más. Por ejemplo, es otra opción: filter.default=special_chars – habilita comillas mágicas solo para HTML. Hay mucho menos conocimiento de estas configuraciones.
PHP 8.1 lanzará una advertencia de obsolescencia si filter.default se establece en cualquier valor que no sea unsafe_raw (el valor por defecto). No verá ningún aviso de desactivación por separado para filter.default_options, pero PHP 9.0 eliminará ambas configuraciones INI.
Como alternativa, puede comenzar a usar la función filter_var (). Filtra variables con el filtro especificado.
Desaprobar autovivification sobre falso
PHP permite la autovivificación (creación automática de matrices a partir de valores falsos). Esta función es muy útil si la variable no está definida.
No obstante, no es ideal crear automáticamente una matriz cuando el valor es falso o nulo.
Este RFC no permite la autovivificación de valores falsos. Sin embargo, tenga en cuenta que todavía se permite la autovivificación a partir de variables no definidas y nulos.
En PHP 8.1, agregar una variable de tipo falso emitirá un aviso de desaprobación:
Deprecated: Automatic conversion of false to array is deprecated in
PHP 9.0 arrojará un error fatal para el mismo, que es idéntico a otros tipos escalares.
los mysqli_driver->driver_version La propiedad está obsoleta
Extensión de MySQLi mysqli_driver-> driver_version La propiedad no ha sido actualizada por 13 años. A pesar de muchos cambios en el controlador desde entonces, todavía devuelve el valor de la versión anterior del controlador, lo que hace que esta propiedad no tenga sentido.
En PHP 8.1, la propiedad mysqli_driver-> driver_version está obsoleta.
Otros cambios menores
Hay muchas más obsoletas en PHP 8.1. Enumerarlos todos aquí será un ejercicio agotador. Te recomendamos que consultes directamente el RFC para ver si hay estas bajas menores.
La página de GitHub de PHP también incluye una guía de NOTAS DE ACTUALIZACIÓN DE PHP 8.1. Enumera todos los cambios importantes que debe considerar antes de actualizar a PHP 8.1.
Resumen
PHP 8.1 no está lejos. Y ya promete superar a su predecesor, lo que no es poca cosa. Cuando se lance, puede estar seguro de saber que Kinsta admitirá PHP 8.1 tanto para entornos en vivo como de prueba (incluso en DevKinsta).
Creemos que las características más interesantes de PHP 8.1 son Enums, Fibers, Pure Intersection Types y sus muchas mejoras de rendimiento. Además, estamos ansiosos por poner a prueba PHP 8.1 y comparar varios frameworks PHP y CMS.
Asegúrese de marcar esta publicación de blog para su referencia futura.
¿Qué función de PHP 8.1 es tu favorita? Comparta sus pensamientos con la comunidad en la sección de comentarios a continuación.
Ahorre tiempo, costos y maximice el rendimiento del sitio con:
- Ayuda instantánea de expertos en alojamiento de WordPress, 24 horas al día, 7 días a la semana.
- Integración de Cloudflare Enterprise.
- Alcance de audiencia global con 28 centros de datos en todo el mundo.
- Optimización con nuestro monitoreo de rendimiento de aplicaciones integrado.
Todo eso y mucho más, en un plan sin contratos a largo plazo, migraciones asistidas y una garantía de devolución de dinero de 30 días. Consulte nuestros planes o hable con ventas para encontrar el plan adecuado para usted.
