Incompatibilidades con versiones anteriores

Si bien la mayoría del código PHP 5 existente debería funcionar sin necesidad de hacer ningún cambio, debe prestarse atención a las siguientes incompatibilidades con versiones anteriores:

  • getrusage() devuelve NULL cuando se pasan argumentos incompatibles a partir de PHP 5.2.1.
  • ZipArchive::setCommentName() devuelve TRUE en caso de éxito a partir de PHP 5.2.1.
  • ZipArchive::setCommentIndex() devuelve TRUE en caso de éxito a partir de PHP 5.2.1.
  • SplFileObject::getFilename() devuelve el nombre del fichero, no ruta/relativa/al/fichero, a partir de PHP 5.2.1.
  • Ha cambiado la prioridad de la variable de entorno PHPRC en Win32 La variable de entorno PHPRC ahora tiene prioridad sobre la ruta de acceso almacenada en el registro de Windows.
  • CLI SAPI ya no busca por los ficheros php.ini o php-cli.ini en el directorio de trabajo actual. En PHP 5.1.x fue agregada una característica no documentada que hizo que el interprete CLI chequeara de forma binaria el directorio de trabajo actual en busca de un fichero de configuración de PHP, esto puede conducir a un comportamiento impredecible si un fichero de configuración inesperado fuera leído. Esta funcionalidad se quitó en 5.2.0, y PHP ya no buscará en el directorio de trabajo actual por la presencia de los ficheros php.ini o php-cli.ini. Ver también la sección de línea de comandos del manual.
  • Se ha añadido una advertencia al realizar operaciones de módulo 0. En versiones anteriores de PHP, realizar entero % 0 no emitía ningún mensaje de advertencia, en su lugar solamente devolvía el valor inesperado FALSE. A partir de PHP 5.2.0, esta operación emitirá un E_WARNING, así como en todos los casos donde se realize una división por cero.
    <?php
    print 10 0;
    /* Warning:  Division by zero in filename on line n */
    ?>
  • __toString() ha sido cambiado para poder ser llamado donde sea aplicable. El método mágico __toString() ahora será llamado en un contexto de cadena, así de simple, en cualquier lugar donde un objeto sea usado como una cadena. La alternativa de devolver una cadena que contiene el identificador del objeto fue quitada en PHP 5.2.0. Se convirtió en un problema debido a que un identificador de objeto no puede ser considerado único. Este cambio significará un daño en aplicaciones que confían en el identificador de objeto como valor de retorno. Un intento de utilizar ese valor como una cadena resultará ahora en un error fatal capturable.
    <?php
    class foo {}
    $foo = new foo;
    print 
    $foo;
    /* Catchable fatal error:  Object of class foo could
       not be converted to string in filename on line n */
    ?>
    Incluso con __toString(), los objetos no pueden ser usados como índices o claves de array. Podemos agregar soporte integrado hash para esto más adelante, pero a partir de PHP 5.2.x necesitará proporcionar su propio hashing o usar la nueva función SPL spl_object_hash(). No pueden ser lanzadas excepciones desde métodos __toString().
    <?php
    class foo {
        public function 
    __toString() {
            throw new 
    Exception;
        }
    }

    try {
        print new 
    foo;
        
    /* Fatal error:  Method foo::__toString() must
           not throw an exception in filename on line n */
    } catch(Exception $e) {}
    ?>
  • Quitadas funciones de clase abstractas estáticas. Debido a un descuido, PHP 5.0.x y 5.1.x permiten funciones abstractas estáticas en las clases. A partir de PHP 5.2.x, sólo las interfaces pueden tenerlas.
    <?php
    abstract class foo {
        abstract static function 
    bar();
        
    /* Strict Standards:  Static function foo::bar()
           should not be abstract in filename on line n */
    }
    ?>
  • La Extensión Oracle requiere al menos Oracle 10 en Windows.
  • Agregado soporte RFC2397 (flujos data:). La introducción del esquema URL 'data' tiene el potencial de dar lugar a un cambio de comportamiento bajo Windows. Si se está trabajando con un sistema de ficheros NTFS y haciendo uso de meta flujos en la aplicación, y si sólo se está utilizando un fichero con el nombre 'data:' al que se accede sin ningún tipo de información de la ruta - esta ya no funcionará más. La solución es utilizar el protocolo 'file:' cuando se accede a él. Ver también » RFC 2397
    <?php
    /* when allow_url_include is OFF (default) */
    include "data:;base64,PD9waHAgcGhwaW5mbygpOz8+";
    /* Warning:  include(): URL file-access is disabled
       in the server configuration in filename on line n */
    ?>
  • Regresión en patrones glob() En la versión 5.2.4 una corrección de seguridad provocó una regresión para patrones de la forma "/foo/*/bar/*". Desde la versión 5.2.5 en lugar de emitir una advertencia la función glob() devolverá FALSE cuando se violan las restricciones openbase_dir.
add a note add a note

User Contributed Notes 6 notes

up
1
php dot manual at frankkleine dot de
6 years ago
Between PHP 5.2.3 and 5.2.4 another backward incompatible change was introduced: parent classes now can not access private properties of child classes with get_object_vars(). See the following example:

class Bar {
    public function dumpBar()  {
        var_dump(get_object_vars($this));
    }
}
class Foo extends Bar {
    public $public = 'public';
    protected $protected = 'protected';
    private $private = 'private';

    public function dump() {
        var_dump(get_object_vars($this));
    }
}

$foo = new Foo();
$foo->dump();
$foo->dumpBar();

The result with PHP < 5.2.4:
E:\php\tests>php get_object_vars.php
array(3) {
  ["public"]    => string(6) "public"
  ["protected"] => string(9) "protected"
  ["private"]   => string(7) "private"
}

array(3) {
  ["public"]    => string(6) "public"
  ["protected"] => string(9) "protected"
  ["private"]   => string(7) "private"
}

And the result with PHP >= 5.2.4:
E:\php-5.2.4-Win32>php ../php/tests/get_object_vars.php
array(3) {
  ["public"]    => string(6) "public"
  ["protected"] => string(9) "protected"
  ["private"]   => string(7) "private"
}

array(2) {
  ["public"]    => string(6) "public"
  ["protected"] => string(9) "protected"
}

As you can see the private property is missing now when dumped from the parent class Bar.
up
0
goellerk at bucks dot edu
4 years ago
str_pad has been modified as well, to enforce UPPERCASE sensitivity on the pad_type declaration.

Optional argument pad_type can be STR_PAD_RIGHT, STR_PAD_LEFT, or STR_PAD_BOTH. If pad_type is not specified it is assumed to be STR_PAD_RIGHT.

If entered as:
$foo = 10;
$wrong = str_pad($foo, 4,'0',str_pad_left);
print "wrong is '$wrong'<br>";

$right = str_pad($foo,4,'0',STR_PAD_LEFT);
print "right is '$right'<br>";

results:
wrong is '    '
right is '  10'
up
0
Alexander Schuch
4 years ago
If the sole reason for having "abstract static methods" is to force the implementation of such a method in a child, consider using an interface for them. The abstract class implements the interface, and a child class extends the base class and defines the "abstract static methods".

<?php
interface I
{
static public function
f();
}

abstract class
C implements I
{
// more/other methods go here
}

class
D extends C
{
static public function
f()
{
echo
'I am f().';
}
}
?>
up
0
jbarker at erepublic dot com
6 years ago
If any of your code relies on includes of URLS  à la allow_url_fopen, be aware that a new directive (allow_url_include) has been added, and that it defaults to Off.
up
0
Erik Osterman
7 years ago
It should be noted that if you provide a __toString method, you can cast the object to a string and use it as an array key (PHP 5.2.x).

e.g.   $array[ (string)$myObject ] = 'foobar';

This is an alternative to using spl_object_hash.
up
-1
Tachy
6 years ago
$string="12345";
$rightstring1=substr($string,-3);
$rightstring2=substr($string,-8);
echo "Result1: ".$rightstring1."<BR>";
echo "Result2: ".$rightstring2."<BR>";

PHP5.1.x:
Result1: 345
Result2: 12345

PHP5.2.x
Result1: 345
Result2: <Empty>
To Top