Изменения класса и объекта

instanceof, is_a(), is_subclass_of() и catch

В PHP 5.0 is_a() была объявлена устаревшей и заменена оператором instanceof. Были некоторые проблемы с первоначальной реализацией instanceof, которая полагалась на __autoload() для поиска отсутствующих классов. Если класс отсутствует, instanceof будет вызывать фатальную ошибку уровня E_ERROR из-за неудачного выполнения __autoload() для поиска класса. Такое же поведение было в операторе catch и в функции is_subclass_of() по этой же причине.

Ни одна из этих функций или операторов не вызывает __autoload() в PHP 5.1.x, а временное решение с помощью class_exists() в коде, написанном для PHP 5.0.x, хотя никоим образом не вызывает проблем, но теперь больше не нужно.

Абстрактные закрытые методы

Абстрактные закрытые методы поддерживались между PHP 5.0.0 и PHP 5.0.4, но затем были запрещены на том основании, что поведение закрытых и абстрактных методов являются взаимоисключающими.

Модификаторы доступа в интерфейсах

В PHP 5.0 объявления функций в интерфейсах обрабатывались точно так же, как объявления функций в классах. Это уже не так с октября 2004 года, когда модификатор доступа public был разрешен в объявлениях функций интерфейса. Начиная с апреля 2005 года, предшествующему выпуску PHP 5.0b1, также разрешен модификатор static. Однако модификаторы protected и private теперь генерируют ошибку уровня E_ERROR, также как abstract. Обратите внимание, что данное изменение не должно повлиять на существующий код, так как ни один из модификаторов не имеет смысла в контексте интерфейсов.

Изменения в правилах наследования

В PHP 5.0 было возможно объвить функцию в производном классе, которая не соответствовала объявлению этой же функции в базовом классе, например.

Этот код выдаст ошибку уровня E_STRICT с 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;
    }
}
?>

Константы классов

В PHP 5.0.x следующий код корректный:

С PHP 5.1.x повторное определение константы класса выдаст ошибку уровня E_ERROR.

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

?>