Cambios retroincompatibles

Aunque la mayoría del código existente en PHP 4 debe de correr sin modificaciones, se debe de prestar atención a los siguientes cambios incompatibles entre versiones:

  • Hay algunas palabras reservadas nuevas.
  • strrpos() y strripos() ahora utilizan todo el string como cadena de búsqueda.
  • El uso ilegal de los índices de las cadenas emite E_ERROR en lugar de E_WARNING. Un ejemplo de uso ilegal es: $str = 'abc'; unset($str[0]);.
  • array_merge() ha sido modificado para que sólo acepte matrices. Si se pasara una variable que no es un array, se emitiría un E_WARNING por cada parámetro. Debe tenerse cuidado para que un código no comience a emitir E_WARNING de la nada.
  • La variable de servidor PATH_TRANSLATED ya no se establece implicitamente en Apache2 SAPI tal como sucedía en PHP 4, donde se establecía el mismo valor que contenía la variable de servidor SCRIPT_FILENAME cuando ésta no estaba completada por Apache. Este cambio fue realizada para cumplir con las » Especificación CGI/1.1. Por favor consulte » bug #23610 para más información, vea tambien la descripción de $_SERVER['PATH_TRANSLATED'] en el manual. Este problema también afecta las versiones de PHP >= 4.3.2.
  • La constante T_ML_COMMENT ya no se define por la extensión Tokenizer. Si se configura error_reporting a E_ALL, PHP emitirá un aviso. Aunque T_ML_COMMENT no llegó a usarse, estaba definido en PHP 4. Tanto en PHP 4 y PHP 5 // y /* */ se resuelven a la constante T_COMMENT. En cualquier caso los comentarios tipo PHPDoc /** */, introducidos en PHP 5, son interpretados por PHP, y son reconocidos como T_DOC_COMMENT.
  • $_SERVER se genera con argc y argv si la directiva variables_order contiene la "S". Si se hubiera configurado el sistema explícitamente para no crear $_SERVER, entonces no se generará. El cambio se hizo para hacer que tanto argc como argv estuvieran siempre disponibles en la versión CLI independientemente del valor de la directiva variables_order. Por tanto, la versión CLI ahora siempre generará la variables globales $argc y $argv.
  • Ya no se considera a un objeto sin propiedades como "vacío".
  • En algunos casos, las clases se deben declarar antes de usarse. Sólo sucede sucede al usar algunas funcionalidades de PHP (como por ejemplo interfaces). En cualquier otro caso, se aplica el funcionamiento antiguo.
  • Ahora get_class(), get_parent_class() y get_class_methods() devuelven el nombre de las clases/métodos tal como se definieron (respetando máyúsculas) lo cual puede provocar errores en scripts antiguos que dependen de este comportamiento (se devolvían los nombres de clases/métodos en minúsculas). Una posible solución pasa por buscar estas funciones en los scripts, y emplear strtolower(). Este cambio en sensibilidad a mayúsculas también se aplica a las constantes predefinidas __CLASS__, __METHOD__, y __FUNCTION__. Se devuelven los valores exactamente como se declararon (sensible a mayúsculas).
  • ip2long() devuelve ahora FALSE cuando se proporciona una IP inválida como argumento a la función, y no -1.
  • Si hubiera funciones definidas en el fichero que se incluye, podrán usarse en el fichero principal, independientemente de si están antes o después del return. Si se incluye dos veces el mismo fichero, PHP5 emite un error fatal ya que las funciones están declaradas, mientras que PHP4 no lo hacía. Se recomienda usar include_once en su lugar para comprobar si el fichero ya se había incluido.
  • include_once y require_once en primer lugar normalizan la ruta del fichero incluido en Windows de forma que incluir A.php y a.php incluyen sólo una vez el fichero.
  • Al pasar un array por valor a una función ya no se reinicia el puntero interno del array para los acceso a éste dentro de la función. En otras palabras, en PHP 4 cuando se pasaba una array a una función, su puntero interno dentro de la función se reiniciaba, mientras que en PHP 5, cuando se pasa un array a una función, su puntero de array dentro de la función será cualesquiera fuera cuando se pasó a la función.

Ejemplo #1 strrpos() y strripos() ahora usan todo el string como cadena de búsqueda

<?php
var_dump
(strrpos('ABCDEF','DEF')); //int(3)

var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>

Ejemplo #2 Ya no se considera "vacío" un objeto sin propiedades

<?php
class test { }
$t = new test();

var_dump(empty($t)); // echo bool(false)

if ($t) {
    
// Se ejecutará
}
?>

Ejemplo #3 En algunos casos, se deben definir las clases antes de usarlas

<?php

//Funciona sin errores:
$a = new a();
class 
{
}


//lanza un error:
$a = new b();

interface 
c{
}
class 
implements {


?>