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;
?>
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.