El lenguaje PHP ha ido evolucionando a lo largo de los años. En algunos casos, las nuevas características o las nuevas notaciones dejan obsoletas las antiguas. En esta lección se comentan los cambios que he ido incorporando a los apuntes, ordenados de acuerdo con la versión de PHP en la que se introdujeron.
La web 3V4L permite ejecutar fragmentos de PHP en muchas versiones de PHP a la vez, lo que permite comprobar directamente los cambios en el lenguaje.
Manual de PHP: Apéndices
Manual de PHP: Cambios en PHP 8.1
Por ejemplo, en el caso de la función intdiv($a, $b) (cociente de una división) o del operador "módulo" % (resto de una división), pensadas para trabajar con números enteros, pero que también admitían números decimales (truncándolos). A partir de PHP 8.1, se puede seguir haciendo, pero se genera un error E_DEPRECATED
<?php
// Antes de PHP 8.1, se podían utilizar números decimales que PHP
// convertía a enteros quitando la parte decimal.
// Todavía se puede hacer, pero PHP genera errores E_DEPRECATED
print "<p>" . intdiv(17.1, 3.1) . "</p>\n";
print "<p>" . 17.1 % 3.1 . "</p>\n";
?>
5
Deprecated: Implicit conversion from float 17.1 to int loses precision in ejemplo.php on line 852
Por ejemplo, aunque PHP no permite índices de matrices que sean números decimales, en PHP se pueden escribir números decimales como índices de matrices porque se convierten automáticamente a enteros (eliminado la parte decimal). A partir de PHP 8.1, se puede seguir haciendo, pero se genera un error E_DEPRECATED
<?php
// Antes de PHP 8.1, se podían utilizar índices decimales que PHP
// convertía a enteros quitando la parte decimal.
// Todavía se puede hacer, pero PHP genera errores E_DEPRECATED
$nombres[1.7] = "Alba";
print "<p>$nombres[1]<p>\n";
?>
Alba
Si en la conversión no hay pérdida de precisión (porque la parte decimal es 0), PHP no muestra ningún aviso:
<?php
$nombres[1.0] = "Alba";
print "<p>$nombres[1]<p>\n";
?>
Alba
En cualquier versión de PHP, la conversión automática a enteros no se realiza directamente dentro de las cadenas, por lo que es necesario utilizar llaves o concatenar las expresiones:
<?php
// Antes de PHP 8.1, se podían utilizar índices decimales que PHP
// convertía a enteros quitando la parte decimal.
// Todavía se puede hacer, pero PHP genera errores E_DEPRECATED
$nombres[1.7] = "Alba";
print "<p>$nombres[1.7]<p>\n";
?>
<?php
// Antes de PHP 8.1, se podían utilizar índices decimales que PHP
// convertía a enteros quitando la parte decimal.
// Todavía se puede hacer, pero PHP genera errores E_DEPRECATED
$nombres[1.7] = "Alba";
print "<p>{$nombres[1.2]}<p>\n";
print "\n";
print "<p>" . $nombres[1.2] . "<p>\n";
?>
Deprecated: Implicit conversion from float 1.7 to int loses precision in ejemplo.php on line 5
Deprecated: Implicit conversion from float 1.7 to int loses precision in ejemplo.php on line 7
Alba
Deprecated: Implicit conversion from float 1.7 to int loses precision in ejemplo.php on line 9
Alba
Por lo tanto en la función recoge() de la lección Recogida de datos que se utiliza en estos apuntes para la recogida de datos de formularios ya no es necesario incluir los argumentos ENT_QUOTES y "UTF-8". El argumento "UTF-8" ya no era necesario desde PHP 5.6.
Manual de PHP: Cambios en PHP 8.0
<?php
$x = 3;
$y = 4;
// Antes de PHP 8.0, la expresión debía escribirse entre paréntesis
// porque incluía una suma:
print "<p>Suma: $x + $y = " . ($x + $y) . "</p>\n";
print "\n";
// A partir de PHP 8.0, los paréntesis no son necesarios
print "<p>Suma: $x + $y = " . $x + $y . "</p>\n";
?>
<p>Suma: 3 + 4 = 7</p>
<p>Suma: 3 + 4 = 7</p>
Comparación | Resultado antes de PHP 8.0 | Resultado después de PHP 8.0 |
---|---|---|
0 == "lo que sea" | true | false |
0 == "" | true | false |
123 == "123abc" | true | false |
Antes de PHP 8.0, para comparar entre números y cadenas, las cadenas no numéricas se convertían a 0. Pero a partir de PHP 8.0 son los números los que se convierten a cadenas y cualquier cadena no numérica se considera mayor que cualquier número.
<?php
if ("a" > 4) {
print "<p>\"a\" > 4</p>";
} else {
print "<p>4 > \"a\"</p>";
}
?>
4 > "a"
"a" > 4
Antes de PHP 8.0, las funciones de ordenación de matrices con elementos de tipos distintos podían dar resultados inconsistentes. En el ejemplo siguiente se ordenan dos matrices que contiene los mismos tres valores, pero en orden diferente. En PHP 7.4 el resultado no se obtenía el mismo resultado, pero a partir de PHP 8.0 sí.
<?php
$valores = [5, "44", "b", ];
print "<pre>Matriz 1: "; print_r($valores); print "</pre>\n";
sort($valores);
print "<pre>Matriz 1 ordenada: "; print_r($valores); print "</pre>\n";
$valores = [5, "b", "44", ];
print "<pre>Matriz 2: "; print_r($valores); print "</pre>\n";
sort($valores);
print "<pre>Matriz 2 ordenada: "; print_r($valores); print "</pre>\n";
?>
Matriz 1: Array
(
[0] => 5
[1] => 44
[2] => b
)
Matriz 1 ordenada: Array
(
[0] => 5
[1] => 44
[2] => b
)
Matriz 2: Array
(
[0] => 5
[1] => b
[2] => 44
)
Matriz 2 ordenada: Array
(
[0] => 44
[1] => b
[2] => 5
)
Matriz 1: Array
(
[0] => 5
[1] => 44
[2] => b
)
Matriz 1 ordenada: Array
(
[0] => 5
[1] => 44
[2] => b
)
Matriz 2: Array
(
[0] => 5
[1] => b
[2] => 44
)
Matriz 2 ordenada: Array
(
[0] => 5
[1] => 44
[2] => b
)
<?php
$valores = [-2 => "a", "b", "c", ];
print "<pre>" . print_r($valores, true) . "</pre>\n";
?>
Array
(
[-2] => "a"
[0] => "b"
[1] => "c"
)
Array
(
[-2] => "a"
[-1] => "b"
[0] => "c"
)
Manual de PHP: Cambios en PHP 7.4
<?php
$x = 123_456;
$y = 123_456.789_012;
print "<p>$x $y</p>\n";
?>
<p>123456 123456.789012</p>
Manual de PHP: Cambios en PHP 7.3
Manual de PHP: Cambios en PHP 7.1
Consecuentemente, desde PHP 7.1 las funciones getrandmax() y mt_getrandmax(), que devolvían el máximo valor que podía obtenerse con las funciones rand() y mt_rand() al ser llamadas sin argumentos, devuelven ahora el mismo valor, que coincide con PHP_INT_MAX.
<?php
$cadena = "abcde";
// Antes de PHP 7.1, las expresiones con índices negativos debían escribirse entre llaves
print "<p>$cadena empieza por $cadena[0] y acaba por {$cadena[-1]}</p>\n";
print "\n";
// A partir de PHP 7.1, se pueden escribir dentro de las cadenas referencias a variables
// con índices negativos
print "<p>$cadena empieza por $cadena[0] y acaba por $cadena[-1]</p>\n";
?>
<p>abcde empieza por a y acaba por e</p>
<p>abcde empieza por a y acaba por e</p>
Manual de PHP: Cambios en PHP 7.0
Manual de PHP: Cambios en PHP 5.6
Manual de PHP: Cambios en PHP 5.4 [copia en archive.org]
Estas son las lecciones que tratan aspectos de PHP que he dejado de explicar en clase porque han quedado "viejos" o se pueden abordar de una forma más "moderna".
En esta lección se explica cómo situar el cursor automáticamente en un control de un formulario recurriendo a JavaScript. Con la introducción del atributo autofocus en HTML 5 este procedimiento se puede considerar obsoleto.
PHP permite definir matrices como constantes con define() desde PHP 5.6 (publicado en agosto de 2014). [ref.: Removed inconsistency regarding behaviour of array in constants at run-time.]
PHP permite definir matrices como constantes con const desde PHP 7.0 (publicado en diciembre de 2015). [ref.: Fixed oversight where define() did not support arrays yet const syntax did.]