[новые возможности РНР 5 и ядра Zend II]материал подготовил: Александр Лозовюк 11.08.2004
Недавно группа разработчиков языка РНР (PHP team) объявила о выходе финальной версии РНР — РНР 5. Язык PHP очень популярен среди веб-программистов, по данным исследования Netcraft (http://www.netcraft.com/Survey/) PHP применяется на 16,251,453 доменах. Выпуск новой версии языка ознаменовал переход РНР на новый уровень — анализируя нововведения видно, что разработчики взяли курс на применения РНР в проектах корпоративного уровня, с применением самых современных технологий (XML, SOAP, web-service) и полноценного объектно-ориентированного подхода.
На большинстве веб-серверов хостинговые компании предлагают еще РНР 4.х версии, только некоторые хостеры начали предоставлять хостинг с использованием новой, 5-й версии. Массовой миграции кончено, ждать не стоит, процесс будет идти медленно, тем более, что ветка 4.3.х все еще развивается и пока обеспечивает большую стабильность, хоть и меньше функциональности. Стоит ли сейчас переходить на новую версию РНР? Однозначного ответа на этот вопрос нет, но для начала надо познакомится с нововведениями и изменениями, чтобы ясно представлять возможности новой платформы.
Скачать РНР 5.0 можно с этой страницы: http://www.php.net/downloads.php#v5 Если вы разрабатываете сайт на локальном веб-сервере под Windows, то закачивайте бинарную версию под win32 — она занимает 7,5 Мб. Сразу же рекомендуется скачать набор дополнительных библиотек (скомпилированных модулей расширения) PECLhttp://www.php.net/get/pecl-5.0.0-Win32.zip/from/a/mirror, по объему это всего 1 Мб, но там много очень полезных библиотек, которые не входят в основной дистрибутив.
Уже после инсталляции нововведения бросаются в глаз — полностью изменилась даже структура каталогов, теперь весь дистрибутив устанавливается в три каталога, все нужные для работы файлы находятся сразу в корневом каталоге, а остальные подкаталоги предназначены для расширений (каталоги /ext, /extras и /pear). Самих исполняемых файлов уже стало целых три — php.exe, php-cgi.exe и php-win.exe. Два из них — php.exe и php-win.exe одинаковые и представляют из себя командный интерпретатор скриптов на РНР, который можно применять в Windows для работы с командной строки (можно ассоциировать двойной клик по файлам с расширением *php с файлом php-win.exe). В таком режиме скрипт работает в фоновом режиме, ничего не выводя в консоль или иным способом, для работы доступны почти все модули и возможности (кроме тех, которые ориентированы на работу в окружении веб-сервера). Для тех, кто любит/хочет поэкспериментировать: если получится установить интерпретатор РНР как системный сервис в Win2000/XP, то можно писать довольно сложные скрипты, которые могу, к примеру, заниматься мониторингом системы или удаленных узлов, обрабатывать статистику и тому подобное.
большинство попробовавших новый релиз РНР сходятся во мнении, что основные нововведения качаются измененной объектной модели, позволяя теперь полноценно использовать мощь обьектно-ориентированного программирования, создавая конкуренцию тому же ASP.NET.
В качестве интерпретатора РНР используется ядро компании Zend, в РНР 5 применяется ядро Zend 2, которое и реализует новые ООП функции. Что же нового в объектной модели РНР 5?
Поддержка модификаторов для членов класса — private, protected, public, которые ограничивают доступ к переменным и функциям члена класса. Пример:
class TestClass { private $hello = ‘тестовая переменная’; }
Теперь нельзя обратиться непосредственно к переменной класса TestClass, с ней могут работать только функции-члены этого класса. Модификатор protected позволит обращаться к функции или переменной из любого производного класса, а public объявляет общедоступную переменную или метод.
Появился интерпретатор для работы из коммандной строки Windows
Появились унифицированные конструкторы и деструкторы для классов. Ранее конструктор назывался так же, как и класс, теперь у каждого класса есть конструктор __construct() и __destructor(), вызываемые при создании и уничтожении объекта класса. Также теперь можно принудительно удалять объект, даже если он еще используется в других местах программы — это делается через вызов оператора delete, который уже сам вызывает деструктор для объекта. Но дальше уже сам программист должен следить за использованием ссылок на удаленный объект — при их использовании будет генерироваться ошибка. Правило простое — сам удалил, сам и следи за целостностью.
Для явного клонирования объекта появилась функция __clone(). Причем, теперь можно гибко управлять клонированием — если разработчик реализует функцию __clone(), то он может задавать какие из свойств объекта и как будут клонироваться, а если нет, то вызываемый обработчик по умолчанию создает точную копию объекта.
Появились унифицированные конструкторы и деструкторы для классов
Ограничение на наследование только от одного класса теперь преодолевается концепцией интерфейсов — класс может наследовать любое количество интерфейсов (это аналогично языку C#, вообще, РНР версии 5 начинает сильно напоминать по функциональным возможностям C#). Интерфейс — это именованный набор абстрактных членов, это значит, что любой класс, наследующий интерфейс, должен сам заботится о конкретной реализации функций — абстрактных членов наследуемого интерфейса. Пример:
// объявляем интерфейс interface company_info { function write_company_tytle(); function write_company_location(); } // мы объявили интерфейс company_info и две функции, но за их // реализацию отвечает класс, который будет наследовать этот интерфейс!
Class my_company implements company_info { // реализуем функции, определенные в интерфейсе function write_company_tytle() { echo ‘ООО «моя компания»‘; }
function write_company_location(); { echo ‘Россия, г. Москва’; } }
Абстрактные методы класса теперь также доступны РНР-программисту (объявляется с помощью ключевого слова abstract, причем абстрактными могут быть как методы, так и целые классы), они аналогичны методам интерфейсов — заботу о реализации берет на себя наследуемый класс.
Оригинальная функция __autoload(class_name) теперь избавляет программиста от необходимости вручную отслеживать все используемые в скрипте классы и подключать файлы с их реализацией вручную.
Для обхода ограничения на наследования применяется концепция интерфейсов
Объектная модель в РНР 5 расширена такими нововведениями как статические члены и методы класса, а также константы класса. Это значит, что свойство (член) или метод класса доступно без создания объекта класса, то есть они хранят данные и методы на уровне класса, а не конкретного объекта этого класса. Хотя при вызове статического метода надо явно указывать класс, в котором он определен, но объекта этого класса не создается. Пример:
class my_company { // объявляем статический метод static function write_company_tytle () { echo ‘ООО «моя компания»‘; }
// еще одно нововведение — константы класса const COMPANY_FOUNDED = ‘2004’; }
// вызываем метод без создания объекта класса. my_company::write_company_tytle();
Если интерфейсы, статические и абстрактные методы используются для расширения возможностей наследования, то ключевое слово final имеет обратную функцию — класс или метод, помеченный как final нельзя наследовать или перегружать. Пример:
// определяем класс как final final class my_company { }
// пытаемся унаследовать класс от my_company class my_corporation extends my_company { } // интерпретатор выдаст ошибку! Так делать нельзя.
Еще полезные изменения затронули такой оператор, как is_a() из РНР 4, теперь для определения принадлежности объекта к конкретному классу используется оператор instanceof. Также теперь можно для функций, которые принимают объекты как параметры явно указывать, объекты каких классов они могут принимать. Если попытаться передать такой функции объект другого класс
а, будет сгенерирована ошибка. Кстати, об ошибках. Теперь есть мощные возможности по отлавливанию и обработке ошибочных ситуаций (исключений). Для создания обработчика исключений нужно наследовать класс Exception, а в коде применять конструкции try/throw/catch для перехвата ошибочных ситуаций в блоках кода. Пока, правда, модули в целях совместимости с предыдущими версиями интерпретатора не используют механизм исключений, но уже новые расширения ее используют.
выше были описаны лишь основные нововведения, причем внимание было сосредоточено на описании новой объектной модели. «За кадром» остались изменения в механизме работы с XML, веб-сервисами, базами данных и другие изменения. Пробуя ответить на вопрос в начале статьи — стоит ли уже сейчас переходить на РНР 5, можно сказать — если планируется реализация сложно бизнес-логики, или много работы с XML, интенсивно используются возможности последних версий СУБД MySQL (4.x и 5.0) или вы хотите попробовать создавать веб-сервисы с поддержкой SOAP 1.2 и WSDL 1.1 — тогда да, проще и выгоднее будет попробовать разработать проект, использую новую версию РНР.