Cambios en clases y objetos

instanceof, is_a(), is_subclass_of() y catch

En PHP 5.0, is_a() quedó obsoleto en favor del operador instanceof. Había algunos problemas con la implementación inicial de instanceof, que dependía de __autoload() para localizar las clases no encontradas. Si no se localizara la clase, instanceof emitiría un error fatal E_ERROR ya que __autoload() fallaría al ubicar la clase. Este mismo comportamiento tenía lugar con el operador catch y con la función is_subclass_of(), por la misma razón.

En PHP 5.1.x ninguna de estas funciones y operadores llama a __autoload(), y los trucos tipo class_exists() que se usaban con PHP 5.0.x, pese a que no provocan problemas, ya no serán necesarios.

Métodos privados abstractos

Los métodos privados abstractos estaban permitidos entre PHP 5.0.0 y PHP 5.0.4, pero se prohibió su uso ya que los comportamientos de private y abstract son mutuamente excluyentes.

Modificadores de acceso en interfaces

En PHP 5.0, las declaraciones de funciones en interfaces se trataban de la misma manera que las declaraciones de funciones en clases. Desde octubre de 2004 esto no es así, fecha a partir de la cual se permite el modificador de acceso public en la declaración de funciones en interfaces. Desde abril de 2005 - fecha de la edición de PHP 5.0b1 - se permitió usar también el modificador static. Pero los modificadores protected y private ahora emiten un error E_ERROR, tal y como pasa con abstract. Debe tenerse en cuenta que este cambio no afectará al código ya existente, ya que ninguno de estos modificadores tiene, en ningún caso, sentido en un contexto de interfaces.

Cambios en reglas de herencia

En PHP 5.0 era posible redeclarar una función, en una clase derivada, que no coincidera con la declaración de esa misma función de la clase base, por ejemplo:

Este código provocará un error E_STRICT en PHP 5.1.x.

<?php
class Base {
    function &
return_by_ref() {
        
$r 1;
        return 
$r;
    }
}

class 
Derived extends Base {
    function 
return_by_ref() {
        return 
1;
    }
}
?>

Constantes de clase

En PHP 5.0.x, el siguiente código era inválido:

En PHP 5.1.x, si se redefine una constante de clase se lanzará un error fatal E_ERROR.

<?php
class test {
    const 
foobar 'foo';
    const 
foobar 'bar';
}

?>