|
|
|
Новое в PHP5
XML и веб-сервисы
Безопасный офис
Защита от копирования и методы ее взлома
История PHP
Корпоративная информационная система
Новое в PHP5
Основные типы данных PHP
Основы языка программирования РНР 5
Программистские байки
Торговая информационная система
|
Новая объектно-ориентированная модель
Новые объектно-ориентированные особенности
Новый диспетчер памяти
Отказ от поддержки Windows 95
Прочие нововведения в язык программирования PHP5
Нововведений было настолько много, что мы не станем подробно описывать их в данном разделе. Вот список лишь самых основных новинок: • Модификаторы public/protected/private, позволяющие управлять доступом к свойствам и методам, например: class MyClass { private $id = 18; public function getldO { return $this->id; } } • Унифицированное имя конструктора: construct(). Теперь можно не присваивать конструктору имя класса, а объявлять его с именем __construct(), что, несомненно, снижает трудозатраты при необходимости изменения имен классов, особенно на ранних стадиях разработки. class MyClass { function __construct() { print "Внутри конструктора"; } } • Добавлена поддержка деструкторов объектов, отсутствовавшая в ранних версиях РНР. Деструкторы должны объявляться как методы с именем __destruct(), они вызываются автоматически при удалении объектов. class MyClass { function __destruct() { print "Выполняется уничтожение объекта"; } } • Интерфейсы. Дают возможность компенсировать отсутствие множественного наследования. Любой класс может иметь только одного «родителя», но может реализовать столько интерфейсов, сколько потребуется. interface Display { function displayO; } class Circle implements Display { function displayO { print "Рисование окружности\п"; } } • Оператор instanceof. Выполняет проверку принадлежности объекта к заданному классу. Теперь не рекомендуется применять устаревшую функцию is_a() из РНР 4. if ($obj instanceof Circle) { print '$obj является экземпляром класса Circle'; } • Финальные методы. При создании метода можно явно запретить его переопределение в производных классах, указав модификатор final. class MyClass { final function getBaseClassName() { return __CLASS__; } } • Финальные классы. Класс, объявленный с модификатором final, уже не может выступать в качестве родоначальника для других классов. Следующий пример приведет к появлению ошибки: final class FinalClass { } class BogusClass extends FinalClass { } • Операция клонирования объектов. Теперь, чтобы создать полную копию объекта, необходимо указать ключевое слово clone. Класс может содержать метод __clone(), который будет вызываться в момент создания копии (после того как будут скопированы все свойства исходного объекта). class MyClass { function __clone() { print "Выполняется клонирование объекта"; } > $obj = new MyClassO; $obj_copy = clone $obj; • Константы класса. Определение класса теперь может содержать объявления констант, доступ к которым осуществляется через имя класса. class MyClass { const SUCCESS = "Success"; const FAILURE = "Failure"; } print MyClass::SUCCESS; • Статические методы. Теперь имеется возможность объявлять статические методы класса, что позволяет вызывать их вне контекста; объектов. Статические методы не получают ссылку $this, поэтому они могут работать только со статическими свойствами и методами класса. class MyClass { static function helloWorldO { print "Привет, МИР!"; } } MyClass:: helloWorldO; • Статические свойства класса. Свойства класса также могут быта объявлены как статические, доступ к которым осуществляется через имя класса. Чаще всего к этой возможности прибегают для создания единичного образца-экземпляра класса. class Singleton { static private $instance = NULL; private function __construct() { } static public function getlnstanceO { if (self::$instance == NULL) { self::$instance = new Singleton(); } return self::$instance; } } • Абстрактные классы. Класс может быть объявлен как абстрактный с помощью модификатора abstract, что предотвратит возможность создания экземпляров этого класса, но при этом сохранится возможность порождать от него дочерние классы. abstract class MyBaseClass { function display() { print "Вызвана процедура вывода по умолчанию"; } } • Абстрактные методы. Метод класса может быть объявлен как абстрактный с помощью модификатора abstract, при этом его реализация откладывается до момента создания класса-наследника. Класс, содержащий абстрактные методы, в свою очередь тоже должен быть объявлен абстрактным. abstract class MyBaseClass { abstract function displayO; } • Указание типов входных аргументов. Теперь объявления функций могут содержать объявления типов входных аргументов. Если такой функции в момент вызова передать аргумент другого типа, будет сгенерировано сообщение об ошибке. function expectsMyClass(MyClass $obj) { } • Поддержка разыменования ссылок на объекты, возвращаемых методами. В РНР 4 отсутствовала возможность обращения к объектам, ссылки на которые возвращались функциями, поэтому приходилось для этих целей задействовать временные переменные. Например, в РНР 4 необходимо было писать такой код: $dummy = $obj->method(); $dummy->method2(); В РНР 5 допускается прямое обращение к возвращаемой ссылке на объект: $obj->method()->method2(); • Итераторы. РНР 5 предусматривает возможность реализации интерфейса Iterator в классах, благодаря чему можно использовать объекты в конструкции fоreach (). $obj = new Mylteratorlmplementation(); foreach ($obj as $value) { print "$value"; } • Автоматическая загрузка классов функцией __autoload(). Большинство разработчиков, занимающихся написанием объектно-ориентированных приложений, располагают определения классов в отдельных файлах (каждый класс в отдельном файле). Самый большой недостаток такого подхода - необходимость вставлять в начало сценария длинный список подключаемых файлов (по одному на каждый класс). В РНР 5 необходимость в этом отпала. Вы можете определить свою функцию __autoload(), которая автоматически вызывается, когда программа пытается обратиться к несуществующему классу. После вызова функции попытка обращения к классу повторяется и, если класс по-прежнему не определен, выдается сообщение об ошибке. function __autoload($class_name) { include_once($class_name . "php"); } $obj = new MyClass1(); $obj2 a new MyClass2();
|
|
|
|