Debido a la introducción de la sintaxis flexible heredoc/nowdoc, los documentos string que contienen la etiqueta final dentro de su cuerpo pueden causar errores de sintaxis o cambios de la interpretación. Por ejemplo en:
<?php
$str = <<<FOO
abcdefg
FOO
FOO;
?>
FOO
con sangría, previamente no tenía ningún
significado especial. Ahora se interpretará como el final de la cadena heredoc y
el siguiente FOO;
provocará un error de sintaxis. Este problema
siempre se puede resolver eligiendo una etiqueta final que no aparezca dentro del
contenido de la cadena.
Declaraciones de continue
dirigidas a switch
las estructuras de flujo de control ahora generarán una advertencia. En php la
declaración continue
es equivalente atargeting switch is equivalent to
break
, mientras estas se comportan como continue 2
en otros lenguajes.
<?php
while ($foo) {
switch ($bar) {
case "baz":
continue;
// Warning: "continue" el modificador equivale a
// "break". ¿Te referías a usar "continue 2"?
}
}
?>
Acceos de array de tipo $obj["123"]
, donde
$obj
implementa ArrayAccess y
"123"
es un integer string literal ya no
dará como resultado una conversión implícita a integer, p.e.,
$obj->offsetGet("123")
se llamará en lugar de
$obj->offsetGet(123)
. Esto coincide para el comportamiento existente
para los no literales. El comportamiento de arrays no se ve afectado de ninguna manera, ellos
continuan explícitamente convirtiendo claves de string integrales a enteros.
En PHP, las propiedades estáticas se comparten entre las clases heredadas, a menos que la propiedad estática se invalide explícitamente en una clase secundaria. Sin embargo, debido a un macanismo de implementación fue posible separar las propiedades estáticas asignando una referencia. Esta laguna ha sido arreglada.
<?php
class Test {
public static $x = 0;
}
class Test2 extends Test { }
Test2::$x = &$x;
$x = 1;
var_dump(Test::$x, Test2::$x);
// Previously: int(0), int(1)
// Now: int(1), int(1)
?>
Referencias devueltas por array y accesos a la propiedad se desenvuelven ahora como parte del acceso. Esto significa que ya no es posible modificar la referencia entre el acceso y el uso del valor de acceso:
<?php
$arr = [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
// Previously: int(4), Now: int(3)
?>
Argumento unpacking dejó de funcionar con Traversables con las claves no enteras. El siguiente código funcionó 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 rediseñada con nuevas opciones y algunas opciones antiguas eliminadas. Ahora está escrito en PHP y no tiene dependencias externas.
Soporte para el BeOS ha sido retirado.
Excepciones lanzadas debido a la conversión automática de advertencias a excepciones en
modo EH_THROW
(e.j. algunas excepciones
DateTime) ya no ocupan el estado error_get_last(). Como
tal, ahora funcionan de la misma manera que las excepciones lanzadas manualmente.
TypeError ahora informa de tipos erróneos como
int
y bool
en lugar de
integer
y boolean
, respectivamente.
Variables no definidas pasadas a compact() será ahora reportado como un aviso.
getimagesize() y funciones relacionadas 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 en
la IANA (véase » RFC 7903).
stream_socket_get_name() devolverá ahora las direcciones IPv6
envueltas entre paréntesis. Por ejemplo "[::1]:1337"
será
devuelto en lugar de "::1:1337"
.
Todas las advertencias lanzadas por las funciones BCMath son ahora usadas por el manejo de errores de PHP. Anteriormente algunas advertencias han sido escritas directamente a stderr.
bcmul() y bcpow() ahora devuelven los números con la escala solicitada. Anteriormente, los números devueltos pueden haber omitido los ceros decimales.
Los inicio de sesión rsh/ssh están desactivados por defecto. Use imap.enable_insecure_rsh si quiere habilitarlos. Tenga en cuenta que la biblioteca IMAP no filtra los nombres de los buzones antes de pasarlos al comando rsh/ssh, pasando así datos no confiables a esta función con rsh/ssh habilitado es inseguro.
Debido al soporte añadido a las capturas nombradas, mb_ereg_*()
los patrones que utilizan las capturas nombradas se comportarán de forma diferente. En particular
las capturas nombradas formarán parte de las coincidencias y mb_ereg_replace()
interpretará sintaxis adicional. Véase Capturas
Nombradas para más información.
Las declaraciones preparadas ahora reportan correctamente los segundos fraccionarios para
DATETIME
, TIME
y
TIMESTAMP
columnas con especificador de decimales (e.j.
TIMESTAMP(6)
cuando se usan microsegundos). Anteriormente, la
parte de los segundos fraccionarios fue simplemente omitida de los valores devueltos.
Las declaraciones preparadas ahora reportan correctamente los segundos fraccionarios para
DATETIME
, TIME
y
TIMESTAMP
columnas con especificador de decimales (e.j.
TIMESTAMP(6)
cuando se usa microsegundos). Anteriormente, la
parte de los segundos fraccionarios fue simplemente omitida de los valores devueltos. Por favor
tenga en cuenta que esto sólo afecta a la utilización de PDO_MYSQL con los preparados emulados apagados
(e.j. usando la funcionalidad de la preparación nativa). Las declaraciones que
utilizan conexiones que tienen PDO::ATTR_EMULATE_PREPARES
=true
(que es el valor por defecto) no se vieron afectados por el fallo arreglado y ya han
obtenido los valores de segundos fraccionarios adecuados al motor.
La exportación Reflection a string utiliza ahora
int
y bool
en lugar de
integer
y boolean
, respectivamente.
Si un autocargador SPL lanza una excepción, los siguientes autocargadores no serán ejecutados. Anteriormente todos los autocargadores eran ejecutados y las excepciones estaban encadenadas.