Con la introducción de la sintaxis flexible heredoc / nowdoc, los string doc que contienen la etiqueta de terminación en su cuerpo pueden causar errores de sintaxis o cambiar en interpretación. Por ejemplo en :
<?php
$str = <<<FOO
abcdefg
FOO
FOO;
?>
FOO
no tenía significado
particular anteriormente. Ahora será interpretada como el final de
la string heredoc y el FOO;
siguiente causará un error
de sintaxis. Este problema puede siempre ser resuelto eligiendo una etiqueta de
terminación que no aparezca en el contenido de la string.
Las declaraciones continue
apuntando a las estructuras de flujo de
control switch
generarán ahora una advertencia.
En PHP estas declaraciones continue
son equivalentes a
break
, mientras que se comportan como
continue 2
en otros lenguajes.
<?php
while ($foo) {
switch ($bar) {
case "baz":
continue;
// Advertencia: "continue" apuntando a switch es equivalente a
// "break". ¿Quiso decir "continue 2"?
}
}
?>
Los accesos de array del tipo $obj["123"]
, donde
$obj
implementa ArrayAccess y
"123"
es una string de int literal ya no
resultarán en una conversión implícita a int, es decir,
$obj->offsetGet("123")
será llamado en lugar de
$obj->offsetGet(123)
. Esto corresponde al comportamiento
para los no literales. El comportamiento de los array no se ve afectado
de ninguna manera, continúan convirtiendo implícitamente
claves de string a int.
En PHP, las propiedades estáticas se comparten entre las clases heredadas, a menos que la propiedad estática sea explícitamente reemplazada en una clase hija. Sin embargo, debido a un artefacto de implementación, era posible separar las propiedades estáticas asignando una referencia. Esta laguna ha sido corregida.
<?php
class Test {
public static $x = 0;
}
class Test2 extends Test { }
Test2::$x = &$x;
$x = 1;
var_dump(Test::$x, Test2::$x);
// Anteriormente: int(0), int(1)
// Ahora: int(1), int(1)
?>
Las referencias devueltas por los arrays y los accesos a las propiedades son ahora descomprimidas en el contexto del acceso. Esto significa que ya no es posible modificar la referencia entre el acceso y el uso del valor accedido:
<?php
$arr = [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
// Anteriormente: int(4), Ahora: int(3)
?>
La descompresión de argumentos ha dejado de funcionar con Traversables con claves no enteras El siguiente código funcionaba en PHP 5.6-7.2 por accidente.
<?php
function foo(...$args) {
var_dump($args);
}
function gen() {
yield 1.23 => 123;
}
foo(...gen());
?>
La utilidad ext_skel ha sido completamente repensada con nuevas opciones y algunas opciones antiguas eliminadas. Esto ahora está escrito en PHP y no tiene ninguna dependencia externa.
El soporte para BeOS ha sido abandonado.
Las excepciones lanzadas debido a una conversión automática de advertencias
en excepciones con el modo EH_THROW
(por ejemplo, algunas
excepciones de DateTime) ya no llenan el estado de
error_get_last(). Como tales, ahora funcionan
de la misma manera que las excepciones lanzadas manualmente.
TypeError ahora reporta los tipos incorrectos
como int
y bool
en lugar de
integer
y boolean
, respectivamente.
Las variables indefinidas pasadas a compact() serán ahora reportadas con una notificación.
getimagesize() y las funciones conexas ahora reportan
el tipo MIME de las imágenes BMP como
image/bmp
en lugar de image/x-ms-bmp
,
ya que el primero ha sido registrado con la IANA (ver
» RFC 7903).
stream_socket_get_name() ahora devuelve las direcciones
IPv6 con corchetes. Por ejemplo, "[::1]:1337"
será
devuelto en lugar de "::1:1337"
.
Todas las advertencias lanzadas por las funciones BCMath ahora utilizan el gestor de errores de PHP. Anteriormente, algunas advertencias se escribían directamente a stderr.
bcmul() y bcpow() ahora devuelven los números con la precisión solicitada. Anteriormente, algunos números podían omitir los ceros decimales finales.
Las autenticaciones rsh/ssh están deshabilitadas por defecto. Utilice imap.enable_insecure_rsh si desea activarlas. Es de notar que la biblioteca IMAP no filtra los nombres de las carpetas antes de pasarlos a los comandos rsh/ssh, por lo que pasar datos no fiables a esta función con rsh/ssh activado es peligroso.
Debido al soporte de capturas nombradas, las máscaras
mb_ereg_*()
que utilizan capturas nombradas se comportarán
de manera diferente. En particular, las capturas nombradas formarán parte de las
coincidencias y mb_ereg_replace() interpretará la
sintaxis adicional. Ver Capturas
Nombradas para más información.
Las declaraciones preparadas ahora reportan las fracciones de segundo
para las columnas DATETIME
, TIME
y
TIMESTAMP
con especificador decimal (por ejemplo
TIMESTAMP(6)
al usar microsegundos).
Anteriormente, las fracciones de segundo eran simplemente omitidas
de los valores de retorno.
Las declaraciones preparadas ahora reportan las fracciones de segundo
para las columnas DATETIME
, TIME
y
TIMESTAMP
con especificador decimal (por ejemplo
TIMESTAMP(6)
al usar microsegundos).
Anteriormente, las fracciones de segundo eran simplemente omitidas
de los valores de retorno. Tenga en cuenta que esto solo afecta
el uso de PDO_MYSQL con las
declaraciones preparadas emuladas desactivadas (por ejemplo, utilizando la
funcionalidad nativa de preparación). Las declaraciones que utilizan conexiones que tienen PDO::ATTR_EMULATE_PREPARES
=true
(que es por defecto) no se ven afectadas por la corrección de error
y ya recuperaban los valores de las fracciones de segundo del motor.
Las exportaciones de Reflection en
string ahora utilizan
int
y bool
en lugar de
integer
y boolean
, respectivamente.
Si un autocargador SPL lanza una excepción, los autocargadores siguientes no serán ejecutados. Anteriormente, todos los autocargadores eran ejecutados y las excepciones eran encadenadas.
Las operaciones matemáticas que implican los objetos SimpleXML tratarán ahora el texto como un int o un float, según lo que sea más apropiado. Anteriormente, los valores eran tratados como un int sin condición.
Desde PHP 7.3.23, los nombres de las cookies entrantes ya no se decodifican por URL por razones de seguridad.