scriptcase.net

PHP 8.1 compatiblilidad

Desde la versión 9.8 en adelante, Scriptcase también es compatible con PHP 8.1.


Funciones obsoletas y/o alteradas en PHP 8.1

A partir de la versión 9.8 en adelante, Scriptcase y las aplicaciones generadas son compatibles con PHP 8.1.

Con estos cambios, algunos de los códigos personalizados por usuarios utilizados en eventos, funciones, métodos y bibliotecas (internas o externas) de sus aplicaciones pueden dejar de funcionar debido a funciones obsoletas o eliminadas en las últimas versiones de PHP. Es responsabilidad del desarrollador corregir los errores resultantes de esta incompatibilidad en los códigos utilizados en eventos o bibliotecas.

A continuación se muestran algunas funciones que ya no funcionarán o que se han modificado en PHP 8.1.

1 - Operadores ternarios anidados sin paréntesis explícitos

Las expresiones condicionales de asignación, utilizadas de forma anidada, ya no están permitidas.

Antes de PHP 8:
$result = $aa != "" ? $xxx : isset($bb) && $bb != "" ?  $zzz : "";
A partir de PHP 8:
if ($aa != "") {
	$result = $xxx;
} elseif (isset($bb) && $bb != "") {
	$result = $zzz;
} else {
	$result = "";
}

2 - Acceder a valores de matriz y cadena usando llaves

El acceso a valores de cadenas y matrices mediante la sintaxis de llaves está en desuso. Utilice $var[$idx] en lugar de $var{$idx}.

En PHP 8.1, usar llaves{} para recuperar valores de la matriz provocará un error.

Antes de PHP 8:
$array = [1, 2];
echo $array[1]; // muestra 2
echo $array{1}; // también muestra 2
 
$string = "foo";
echo $string[0]; // muestra "f"
echo $string{0}; // también muestra "f"
A partir de PHP 8:
$array = [1, 2];
echo $array[1]; // muestra 2
echo $array{1}; // muestra el error: Deprecated: Array and string offset access syntax with curly braces is deprecated...
 
$string = "foo";
echo $string[0]; // muestra "f"
echo $string{0}; // muestra el error: Deprecated: Array and string offset access syntax with curly braces is deprecated...

3 - Parámetros obligatorios después de que se interrumpan los parámetros opcionales

A partir de PHP 8, ya no se permite declarar una función o método agregando un parámetro obligatorio después de los parámetros opcionales.

Esto significa que la siguiente declaración de función dará como resultado una Aviso:
function foo($param_optional = null, $param_required) {
//           ^^ optional parameter , ^^ required parameter
}
Ejemplo de ‘Aviso’ generado por PHP:
Deprecated: Required parameter $param_required follows optional parameter $param_optional in ... on line ...

4 - Operaciones aritméticas con cadenas no numéricas

Hasta PHP 7 era posible realizar operaciones matemáticas con variables que contenían cadenas no numéricas, que en esta situación equivalía a cero.
En PHP 8.1 este tipo de cálculo comenzaba a mostrar un error.

Antes de PHP 8, el siguiente código no generaría un error:
$b = "";
$a = $b + 2;
Desde PHP 8 en adelante, es necesario probar si el valor de $b es una cadena numérica o un número, antes de realizar la operación:

I.e 1:
$a = is_numeric($b) ? $b + 2 : 2;
I.e 2:
if (!is_numeric($b)) {
	$b = 0;
}

$a = $b + 2;

5 - Variables e índices inexistentes

Hasta PHP 7 había cierta tolerancia respecto a las referencias a variables o índices indefinidos, generando únicamente un Aviso.

En PHP 8, cualquier referencia a una variable inexistente o índice de matriz generará una Advertencia.

Entonces, si su PHP está habilitado para mostrar Advertencias, encontrará errores para ese contexto.

Para solucionarlo, es necesario probar si existe una variable o índice de matriz, antes de usarlo en alguna operación.

I.e:
$a = isset($b) ? $b + 2 : 2;

6 - Función ‘each()’

Devuelve el par clave/valor actual de una matriz y avanza su cursor.
Esta función se eliminó en PHP 8, si la está utilizando en sus aplicaciones, debe cambiar el código antes de publicar en un entorno con PHP 8 o superior.

Algunas opciones de sustitución:
foreach()
I.e:
$result = "";
$tab = array(0=>array('tp'=>1,'vl'=>'aaa'),
	    1=>array('tp'=>2,'vl'=>'bbb'),
	    2=>array('tp'=>3,'vl'=>'ccc'));
Antes de PHP 8:
while (list ($key, $val) = each($tab)) {
	$result .= $tab[$key]["vl"];
}
A partir de PHP 8, usando foreach():
foreach ($tab as $key => $val) {
	$result .= $tab[$key]["vl"];
}

7 - Función array_key_exists()

Comprueba si existe una clave o un índice en una matriz.
Su uso en objetos está en desuso, en su lugar deben usarse isset()   o   property_exists().

Antes de PHP 8:
if (array_key_exists('index', $array1)) {
	// codigo
}
A partir de PHP 8:
if (isset($array1['index'])) {
	// codigo
}

8 - Función money_format()

Proporcione el formato de número como una cadena de moneda.
Esta función se eliminó de PHP 8 y en adelante, se puede reemplazar por la función intl NumberFormatter.

Antes de PHP 8:
echo money_format("%.2n", 1234.56);
A partir de PHP 8:
$currencyObject = new NumberFormatter("pt-BR", NumberFormatter::CURRENCY);
echo $currencyObject->format(1234.56);

9 - Función mb_strrpos()

Busca la posición de la última aparición de un valor en una cadena.
Pasar la codificación como tercer parámetro a la función está en desuso..

En su lugar, pase un desplazamiento 0 y la codificación como el cuarto parámetro:

Antes de PHP 8:
$string = 'O rato roeu a roupa';
echo mb_strrpos($string, 'roeu', 'UTF-8');
A partir de PHP 8:
$string = 'O rato roeu a roupa';
echo mb_strrpos($string, 'roeu', 0, 'UTF-8');

Lista completa de cambios de PHP

Para tener la lista completa de cambios en PHP siga los enlaces según la versión de PHP.