Еще в ноябре 2005 года на встрече в Париже разработчики обсудили новые возможности следующей, шестой, версии PHP. Интересует ли Вас, какой будет эта версия? Примите участие в опросе, который проводится на сайте рассылки.
[опрос на английском языке: PHP 6: Are you interesting in? (PHP 6: Вы зантересованы?) - YES (ДА) - NO (НЕТ)]
PHP 5: Новые возможности.
Переход от PHP 4 к PHP 5
The Pterodactyl
Copyright 2006 Pterodactyl's School
Copyright 2006 Pterodactyl's School.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
09.06.2006
История переиздания
Издание 1.00
[ Дата ]
Первоначальная версия.
Аннотация
Рассмотрены проблемы совместимости PHP 4 и PHP 5. Названы наиболее типичные источники несовместимости и рассмотрены пути ее преодоления.
Несмотря на широко декларируемый принцип обратной совместимости, изменения в PHP 5 настолько существенны, что не все скрипты, написанный под PHP 4, сразу же без проблем начинают работать под PHP 5.
Что же делать, чтобы заставить такие скрипты работать должным образом? Зная это, перевод существующих скриптов под PHP 5 окажется достаточно простым делом.
Сервер
Переход к PHP 5 требует незначительных изменений в настройках сервера. Например, для сервера Apache необходимо изменить одну строку в конфигурационном файле httpd.conf.
В 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 для того, чтобы объекты считались равными, необходимо дополнительное уловие: они должны принадлежать одному и тому же классу.
Присвоение $this
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');
Функция get_class()
В PHP 5 эта функция возвращает название класса с сохранением регистра (в отличие от PHP 4; там название класса всегда приводится к нижнему регистру).
Решением является использование следующего кода.
$cname = strtolower(get_class($obj));
Уровень сообщений E_STRICT
В 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.
MySQL
Поддержка MySQL более не включена в PHP 5 по умолчанию.
Включить поддержку MySQL можно на этапе компиляции (Unix) либо путем подключения соответствующего расширения (Windows).
Можно также использовать альтернативный вариант - расширение SQLite, включающее одновременно как встроенный сервер, так и функции для доступа к нему.
Функции
PHP 5 включает целый ряд новых и измененных функций.
Значительно дополнены и улучшены функции для работы с массивами (Array Functions), строками (String Functions), датами и временем (Date and Time Functions), потоками (Stream Functions)
и др.
Литература
[1] PHP Manual. MehdiAchour, FriedhelmBetz, AntonyDovgal, NunoLopes, PhilipOlson, GeorgRichter,
DamienSeguy, and JakubVrana. 2006-05-26. Copyright 1997-2006 the PHP Documentation Group. http://www.php.net/manual/en/.
[2] PHP 5 Power Programming. AndiGutmans, StigBakken, and DerickRethans. Prentice Hall PTR. www.phptr.com. Copyright
2005 Pearson Education, Inc..