Отправляет email-рассылки с помощью сервиса Sendsay

PHP 5: Новые возможности.

  Все выпуски  

Переход от PHP 4 к PHP 5


Вниманию читателей!

Отдельные выпуски рассылки в той или иной мере взаимосвязаны; особенно, это относится к материалам практических занятий.

С предыдущими выпусками Вы можете ознакомиться:

  1. в архиве рассылки (оригиналы выпусков);
  2. на сайте рассылки (исправленные и дополненные версии).

# # #

Вы также можете подписаться на рассылку "PHP 5 для начинающих".

PHP 6 уже в разработке!

Еще в ноябре 2005 года на встрече в Париже разработчики обсудили новые возможности следующей, шестой, версии PHP. Интересует ли Вас, какой будет эта версия? Примите участие в опросе, который проводится на сайте рассылки.

http://pterodactyl.l2p.net/e107/

[опрос на английском языке: PHP 6: Are you interesting in? (PHP 6: Вы зантересованы?) - YES (ДА) - NO (НЕТ)]

PHP 5: Новые возможности.

The Pterodactyl

Copyright 2006 Pterodactyl's School

09.06.2006

История переиздания
Издание 1.00 [ Дата ]
Первоначальная версия.

Аннотация

Рассмотрены проблемы совместимости PHP 4 и PHP 5. Названы наиболее типичные источники несовместимости и рассмотрены пути ее преодоления.


Несмотря на широко декларируемый принцип обратной совместимости, изменения в PHP 5 настолько существенны, что не все скрипты, написанный под PHP 4, сразу же без проблем начинают работать под PHP 5.

Что же делать, чтобы заставить такие скрипты работать должным образом? Зная это, перевод существующих скриптов под PHP 5 окажется достаточно простым делом.

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

Решением может служить передача в функцию клона объекта (clone($obj)) вместо самого объекта. Однако, такое решение требует анализа и изменения исходного кода.

Более радикальным и надежным представляется изменение настроек PHP 5, а именно, включение режима совместимости (compatibility mode). Для этого следует включить директиву zend.ze1_compatibility_mode в конфигурационном файле php.ini, httpd.conf или .htaccess (либо в самом скрипте при помощи функции ini_set()).

php_admin_flag zend.ze1_compatibility_mode on
php_flag zend.ze1_compatibility_mode on
ini_set('zend.ze1_compatibility_mode', true);

Помимо смены способа передачи объектов в функции, режим совместимости влияет также на кастинг объектов и их сравнение, обеспечивая поведение, свойственное PHP 4.

Кастинг объектов. В PHP 4 результат приведения объектов к логичесому, целочисленному или типу чисел с плавающей запятой зависел от наличия у объекта переменных. Если объект обладал хотя бы одной переменной, результатом приведения была единица; в противном случае - ноль. В PHP 5 результат приведения всегда равен единице.

print (int) new stdClass;
1

Сравнение объектов. В PHP 4 оператор равенства (==), примененный к двум объектам, возвращает true, если все переменные у обоих объектов равны. В PHP 5 для того, чтобы объекты считались равными, необходимо дополнительное уловие: они должны принадлежать одному и тому же классу.

PHP 5 не позволяет переопределять $this, что может быть проблемой, например, для некоторых классов PEAR, использующих этот прием.

class Foo {
    function Foo($class)
    {
        $this = new $class;
    }
}

class Bar {
}

$foobar = new Foo('Bar');
        
Fatal error:  Cannot re-assign $this

Существует несколько решений этой проблемы - от эмуляции присвоения путем статического вызова конструктора "присваемого" класса до генерации исключительной ситуации или ее эмуляции. Однако, наиболее предпочтительным, совместимым с обеими версиями PHP, представляется использование шаблона-одиночки (singleton).

class Foo {
    function singleton($class)
    {
        if (class_exists($class)) {
            return new $class;
        }
    }
}

class Bar {
}

$foobar = Foo::singleton('Bar');
        

В PHP 5 вводится новый уровень сообщений - E_STRICT, который может быть включен путем установки директивы, управляющей уровнем сообщений об ошибках, в состояние E_ALL | E_STRICT.

error_reporting(E_ALL | E_STRICT);

Сообщения уровня E_STRICT генерируются в тех случаях, когда в коде используются устаревшие возможности предыдущих версий PHP. Рассмотрим несколько таких устаревших возможностей.

Автоматическое создание объектов. При попытке присвоить значение несуществующей переменной несуществующего объекта автоматически создается новый объект класса stdClass.

$foo->bar = true;   // deprecated!

Объявление переменных класса (var). Поддерживается только ради обратной совместимости. Следует использовать модификаторы уровня доступа: public, protected или private.

Устаревший конструктор. Конструктор с именем, совпадающим с названием класса, поддерживается только ради обратной совместимости. Следует использовать унифицированный конструктор __construct.

Перекрытие наследуемых методов. Изменение объявления одноименных методов в наследуемых классах (изменение числа параметров) не приветствуется в PHP 5.

Created with DocBook Created with Libxslt


В избранное