Изменения класса и объекта
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';
}
?>