[1 страница] Введение Этот документ - достаточно вольный перевод статьи с официального сайта PHP - http://php.net/. Если у вас нет проблем с английским языком, рекомендую ознакомиться с первоисточником. Новая объектная модель
Обработка объектов в Zend Engine 2 полностью переработана: повышена производительность и добавлены новые возможности. В предыдущих версиях PHP объекты обрабатывались так же, как и переменные простых типов (например, целочисленные значения или строки). Недостаток такого подхода в том, что при присваивании (или передаче объекта как параметра функции) происходило копирование объекта. При новом подходе, объекты передаются по ссылке, а не по значению (если вам незнакома эта терминология, можете представить себе ссылку как уникальный идентификатор объекта).
Многие PHP-программисты никогда не задумывались об аспекте копирования объекта, присущем старой объектной модели; следовательно, большинство существующих PHP-программ при переходе на PHP5 будут нормально работать без необходимости модификации кода, или же требуемая модификация будет весьма несущественной.
Частные и защищенные элементы класса В PHP5 введены частные (private) и защищенные (protected) переменные-элементы класса (member variables), что позволяет определять область их видимости.
Пример:
Защищенные (protected) переменные-элементы класса доступны методам (methods) класса, в котором они объявлены, и методам производного от него класса. Частные (private) элементы класса доступны только методам класса, в котором они объявлены.
<?php class MyClass { private $Hello = "Hello, World!n"; protected $Bar = "Hello, Foo!n"; protected $Foo = "Hello, Bar!n";
function printHello() { print "MyClass::printHello() " . $this->Hello; print "MyClass::printHello() " . $this->Bar; print "MyClass::printHello() " . $this->Foo; } }
class MyClass2 extends MyClass { protected $Foo;
function printHello() { MyClass::printHello(); /* Выведет значение */ print "MyClass2::printHello() " . $this->Hello; /* Ничего не выведет */ print "MyClass2::printHello() " . $this->Bar; /* Не выведет значение (переменная не определена)*/ print "MyClass2::printHello() " . $this->Foo; /* Выведет значение */ } }
$obj = new MyClass(); print $obj->Hello; /* Ничего не выведет */ print $obj->Bar; /* Ничего не выведет */ print $obj->Foo; /* Ничего не выведет */ $obj->printHello(); /* Выведет значение */
$obj = new MyClass2(); print $obj->Hello; /* Ничего не выведет */ print $obj->Bar; /* Ничего не выведет */ print $obj->Foo; /* Ничего не выведет */ $obj->printHello(); ?>
Частные и защищенные методы В PHP5 также введены частные (private) и защищенные (protected) методы.
Пример:
<?php class Foo { private function aPrivateMethod() { echo "Вызван метод Foo::aPrivateMethod().n"; }
protected function aProtectedMethod() { echo "Вызван метод Foo::aProtectedMethod().n"; $this->aPrivateMethod(); } }
class Bar extends Foo { public function aPublicMethod() { echo "Вызван метод Bar::aPublicMethod().n"; $this->aProtectedMethod(); } }
$o = new Bar; $o->aPublicMethod(); ?>
Существующие программы, не испольующие собственные классы или функции, названные "public", "protected" или "private", будут работать без каких-либо изменений.
Абстрактные классы и методы В PHP5 также введены абстрактные (abstract) классы и методы. Абстрактный метод представляет собой только объявление метода и не предусматривает его реализации. Класс, содержащий абстрактные методы, должен быть объявлен абстрактным.
Пример:
<?php abstract class AbstractClass { abstract public function test(); }
class ImplementedClass extends AbstractClass { public function test() { echo "Вызван метод ImplementedClass::test().n"; } }
$o = new ImplementedClass; $o->test(); ?>
Создание экземпляра абстрактного класса невозможно.
Существующие программы, не испольующие собственные классы или функции, названные "abstract", будут работать без каких-либо изменений.
Интерфейсы В PHP5 введены интерфейсы (interfaces). Класс может реализовывать произвольное число интерфейсов.
Пример:
<?php interface Throwable { public function getMessage(); }
class Exception implements Throwable { public function getMessage() { // ... } } ?>
Существующие программы, не испольующие собственные классы или функции, названные "interface" или "implements", будут работать без каких-либо изменений.
Уточнение типа класса (Class Type Hints) Оставаясь слабо типизированным языком, PHP5 предоставляет возможность использовать уточнения типа класса (class type hints) для указания ожидаемого класса объекта, передаваемого методу в качестве параметра.
Пример:
<?php interface Foo { function a(Foo $foo); }
interface Bar { function b(Bar $bar); }
class FooBar implements Foo, Bar { function a(Foo $foo) { // ... }
function b(Bar $bar) { // ... } }
$a = new FooBar; $b = new FooBar;
$a->a($b); $a->b($b); ?>
Уточнения типов класса не проверяются не при компиляции, как в большинстве языков со строгой типизацией, а во время исполнения. Это означает, что следующие фрагменты кода эквивалентны:
<?php function foo(ClassName $object) { // ... } ?>
<?php function foo($object) { if (!($object instanceof ClassName)) { die("Argument 1 must be an instance of ClassName"); } } ?>
Данный синтаксис применим только к объектам/классам, но не к встроенным типам данных.
Ключевое слово final В PHP5 введено ключевое слово "final", используемое для определения финальных элементов и методов класса. Элементы и методы, в объявлении которых указано ключевое слово "final", нельзя переопределить в классе-потомке.
Пример:
<?php class Foo { final function bar() { // ... } } ?>
Также возможно использовать ключевое слово "final" в определении самого класса, что запретит создание производных от него классов. При этом все элементы и методы такого класса автоматически являются финальными, и определять их таковыми явно нет необходимости.
Пример:
<?php final class Foo { // определение класса }
// следующая строка вызовет ошибку времени выполнения // class Bork extends Foo {} ?>
Свойства не могут быть финальными.
Существующие программы, не испольующие собственные классы или функции, названные "final", будут работать без каких-либо изменений.
[fixxxer] Примечание: в PHP все методы класса являются виртуальными.
|