Новые возможности объектной модели являются слишком многочисленными, чтобы
дать детальное описание в этой главе. В главе, посвященной объектной модели,
будут рассмотрены в деталях все новые возможности.
- public/private/protected - модификаторы доступа для методов и свойств
Позволяют управлять доступом к методам и свойствам.
<?php
class MyClass
{
private $id
= 18;
public function getId() {
return $this->id;
}
}
?>
- Унифицированный конструктор __construct()
Конструктор, ранее совпадавший с названием класса, теперь необходимо
объявлять как __construct(), что позволит легче перемещать классы в иерархиях.
<?php
class MyClass
{
function __construct() {
print
"Inside constructor";
}
}
?>
- Поддержка деструктора для класса, определяемого как метод __destructor()
Позволяет определить функцию деструктора, которая будет выполнена при
уничтожении объекта.
<?php
class MyClass
{
function __destruct() {
print
"Destroying object";
}
}
?>
- Интерфейсы
Класс может наследовать только один класс, но при этом может иметь столько
интерфейсов, сколько потребуется.
<?php
interface Display {
function
display();
}
class Circle implements Display {
function display() {
print
"Displaying circle ";
}
}
?>
- Оператор instanceof
Поддержка проверки зависимости от других объектов. Функцией is_a(), известной
из PHP 4, пользоваться теперь не рекомендуется.
<?php
if ($obj
instance of Circle) {
print '$obj is a Circle';
}
?>
- Метод final
Ключевое слово final позволяет вам помечать методы, чтобы наследующий класс
не мог перегрузить их.
<?php
class MyClass
{
final
function getBaseClassName() {
return
__CLASS__;
}
}
?>
- Классы, помеченные как final
После объявления класса final он не может быть унаследован. Следующий пример
вызовет ошибку:
<?php
final class FinalClass
{
}
class BogusClass extends FinalClass {
}
?>
- Явное клонирование объекта
Чтобы явно клонировать объект, вы должны использовать ключевое слово clone.
Вы можете объявить метод __clone(), который будет вызван при клонировании
объекта (после того, как все свойства будут скопированы из исходного объекта).
<?php
class MyClass
{
function __clone() {
print
"Object is being cloned";
}
}
$obj =
new MyClass();
clone $obj;
?>
- Константы класса
В определения классов теперь можно включить константы, и ссылаться на них,
используя объект.
<?php
class MyClass
{
const SUCCESS
= "Success";
const FAILURE = "Failure";
}
print MyClass::SUCCESS;
?>
- Статические члены класса
Определения классов могут теперь включить статических членов класса (свойства
и методы), доступ к которым осуществляется через класс. Общее использование
статических членов показано на примере:
<?php
class Singleton
{
static private
$instance = NULL;
private function __construct() {
}
static public function getInstance() {
if (self::$instance == NULL) {
self::$instance = new Singleton();
}
return self::$instance;
}
}
?>
- Статические методы
Вы можете теперь определить методы как статические, разрешая им быть
вызванными вне контекста объекта. Статические методы не определяются через
переменную $this, поскольку они не должны быть ограничены определенным объектом.
<?php
class MyClass
{
static function helloWorld() {
print
"Hello, world";
}
}
MyClass::helloWorld();
?>
- Абстрактные классы
Класс может быть объявлен как абстрактный при помощи использования ключевого
слова abstract, для исключения из обработки движком описания класса. Однако, вы
можете наследовать абстрактные классы.
<?php
abstract class MyBaseClass {
function
display() {
print "Default display routine being
called";
}
}
?>
- Абстрактные методы
Метод может быть объявлен как abstract, таким образом отложив его определение
наследуемым классом. Класс, который включает абстрактные методы, должен быть
объявлен как abstract.
<?php
abstract class MyBaseClass {
abstract function display();
}
?>
- Указание класса как типа
Определения функции могут включить указание типа класса, передаваемого в
качестве параметра. Если функция будет вызвана с неправильным типом, произойдет
ошибка.
<?php
function expectsMyClass(MyClass $obj) {
}
?>
- Поддержка разыменования объектов, которые возвращаются методами.
В PHP 4 вы не могли непосредственно разыменовывать объекты, которые
возвращаются из методов. Вы должны были бы сначала присвоить такой объект некой
фиктивной переменной.
Поясним на примере. В PHP 4:
<?php
$dummy = $obj->method();
$dummy->method2();
?>
В PHP 5:
<?php
$obj->method()->method2();
?>
- Итераторы
PHP 5 позволяет последовательно получать доступ к элементам класса через
конструкцию foreach().
<?php
$obj = new MyIteratorImplementation();
foreach
($obj as $value) {
print
"$value";
}
?>
- __autoload()
Многие разработчики, пишущие объектно-ориентированные приложения, создают
один файл, в котором содержится определение класса. Очень неудобно писать в
начале каждого скрипта длинный список включаемых файлов по одному на каждый
класс.
В PHP 5 в этом больше нет необходимости. Вы можете определить функцию
__autoload() , которая автоматически будет вызываться в случае использования
класса, который не был определен выше. Вызывая такую функцию, Zend Engine
дает возможность загрузить файл с определением класса прежде, чем будет
сформировано сообщение об ошибке и выполнение скрипта прекратится.
<?php
function __autoload($class_name) {
include_once($class_name . "php");
}
$obj = new
MyClass1();
$obj2 = new
MyClass2();
?>