В PHP5 введено ключевое слово instanceof, позволяющее определить, является или не является объект экземпляром класса, экземпляром, производным от класса, или же реализацией интерфейса.
Пример:
<?php class baseClass { }
$a = new baseClass;
if ($a instanceof basicClass) { echo Hello World; } ?>
Статические переменные функций
Статические переменные теперь обрабатываются на этапе компиляции, что позволяет присваивать им значения по ссылке. Это изменение также значительно повышает производительность, но означает, что косвенные ссылки на статические переменные больше не будут работать.
Для параметров, передаваемых по ссылке, теперь можно указать значения по умолчанию
Пример:
<?php function my_function(&$var = null) { if ($var === null) { die($var needs to have a value); } } ?>
__autoload()
Функция __autoload() вызывается автоматически в случае, когда происзодит попытка создания неопределенного класса. Имя класса передается функции __autoload() в качестве единственного аргумента.
Пример:
<?php function __autoload($className) { include_once $className . .php; }
$object = new ClassName; ?>
Перегрузка вызовов метода и доступа к свойствам
Как вызовы методов, так и операции доступа к свойствам могут быть перегружены с использованием методов __call(), __get() и __set().
Пример: __get() и __set()
<?php class Setter { public $n; public $x = array(a => 1, b => 2, c => 3);
Для объекта можно указать итератор, который будет использован при применении класса в операторе foreach. По умолчанию итерация происходит путем перебора всех свойств.
Пример:
<?php class Foo { var $x = 1; var $y = 2; }
$obj = new Foo;
foreach ($obj as $prp_name => $prop_value) { // using the property } ?>
Каждый класс, экземпляры которого можно использовать с оператором foreach, должен реализовывать пустой интерфейс Traversable. Другими словами, любой объект, котороый реализует Traversable, можно использовать с foreach.
Интерфейсы IteratorAggregate и Iterator позволяют указать поведение класса при его использовании с оператором foreach. Первый интерфейс предоставляет единственный метод getIterator(), который должен возвращать массив или объект, который либо реализует интерфейс Iterator, либо является объектом встроенного класса, имеющего итератор.
Пример:
<?php class ObjectIterator implements Iterator {
private $obj; private $num;
function __construct($obj) { $this->obj = $obj; } function rewind() { $this->num = 0; } function hasMore() { return $this->num < $this->obj->max; } function key() { return $this->num; } function current() { switch($this->num) { case 0: return 1st; case 1: return 2nd; case 2: return 3rd; default: return $this->num.th; } } function next() { $this->num++; } }
class Object implements IteratorAggregate {
public$max = 3;
function getIterator() { return new ObjectIterator($this); } }
$obj = new Object;
// this foreach ... foreach($obj as $key => $val) { echo $key = $valn; }
// matches the following 7 lines with the for directive. $it = $obj->getIterator(); for($it->rewind(); $it->hasMore(); $it->next) { $key = $it->current(); $val = $it->key(); echo $key = $valn; } unset($it); ?>
Данный пример весьма интерестен, так как демонстрирует использование всех абстрактных методов, объявленных в интерфейсах Iterator и IteratorAggregate соответственно.
Новая константа __METHOD__
Новая псевдо-константа __METHOD__ содержит текущие имена класса и метода, если используется внутри метода, и имя функции, если используется вне класса.
Новый метод __toString() позволяет перегрузить преобразование типа "объект->строка".
Пример:
<?php class Foo { function __toString() { return What ever; } }
$obj = Foo;
$str = (string) $obj; // вызывается __toString()
echo $obj; // вызывается __toString() ?>
Reflection API
PHP5 включает в себя reflection API, предоставляющий возможность реверс-инжиниринга классов, интерфейсов, функций, методов, а также расширений (extensions).
Reflection API также предоставляет доступ к doc-комментариям функций, классов и методов.
Практически все аспекты ОО-кода могут быть отражены с помощью reflection API. Reflaction API документируется отдельно.
Пример:
<?php class Foo { public $prop; function Func($name) { echo Hello $name; } }
В PHP5 используется новый диспетчер памяти, более эффективно работающий в мультитрэдовой среде, так как он не использует мутексы (mutexes) для осуществления блокирования/разблокирования (lock/unlock) при операциях выделения/освобождения памяти (allocation/deallocation).