Основы
class
Каждое определение класса начинается с ключевого слова class, затем следует имя класса, и далее пара фигурных скобок, которые заключают в себе определение свойств и методов этого класса.
Именем класса может быть любое слово, при условии, что оно не входит в список зарезервированных слов PHP, начинается с буквы или символа подчеркивания и за которым следует любое количество букв, цифр или символов подчеркивания.
Класс может содержать собственные константы, переменные (называемые свойствами) и функции (называемые методами).
<?php
class SimpleClass
{
// объявление свойства
public $var = 'значение по умолчанию';
// объявление метода
public function displayVar() {
echo $this->var;
}
}
?>
$this
Псевдо-переменная $this доступна в том случае, если метод был вызван в контексте объекта. $this является ссылкой на вызываемый объект. Обычно это тот объект, которому принадлежит вызванный метод.
Замечание: статические методы можно так же вызывать и через конструкцию $obj->staticMethod()
.
new
Для создания экземпляра класса используется директива new. Новый объект всегда будет создан, за исключением случаев, когда он содержит конструктор, в котором определен вызов исключения в случае ошибки. Рекомендуется определять классы до создания их экземпляров (в некоторых случаях это обязательно).
Если с директивой new используется строка (string), содержащая имя класса, то будет создан новый экземпляр этого класса. Если имя находится в пространстве имен, то оно должно быть задано полностью.
<?php
$instance = new SimpleClass();
// Это же можно сделать с помощью переменной:
$className = 'Foo';
$instance = new $className(); // Foo()
?>
В PHP 5.3.0 можно создать объект с помощью инстанса другого объекта:
$obj = new $instance;
var_dump($obj !== $instance); // false
extends
Класс может наследовать методы и свойства другого класса используя ключевое слово extends при его описании. Невозможно наследовать несколько классов, один класс может наследовать только один базовый класс.
Наследуемые методы и свойства могут быть переопределены (за исключением случаев, когда метод класса объявлен как final) путем объявления их с теми же именами, как и в родительском классе. Существует возможность доступа к переопределенным методам или статическим методам путем обращения к ним через parent::
Когда переопределяются методы, число и типы аргументов должны оставаться такими же как и были, иначе PHP вызовет ошибку уровня E_STRICT. Это не относится к конструктору, который можно переопределить с другими параметрами.
<?php
class ExtendClass extends SimpleClass
{
// Переопределение метода родителя
function displayVar()
{
echo "Расширенный класс\n";
parent::displayVar();
}
}
$extended = new ExtendClass();
$extended->displayVar();
/*
Расширенный класс
значение по умолчанию
*/
?>
::class
Начиная с версии PHP 5.5 можно использовать ключевое слово class для разрешения имени класса. С помощью конструкции ClassName::class можно получить строку с абсолютным именем класса ClassName. Обычно это довольно полезно при работе с классами, использующими пространства имен:
<?php
namespace NS {
class ClassName {
}
echo ClassName::class;
}
/*
NS\ClassName
*/
?>
Свойства
Переменные, которые являются членами класса, называются "свойства". Они определяются с помощью ключевых слов public, protected, или private, следуя правилам правильного описания переменных. Это описание может содержать инициализацию, но инициализация должна применяться для константных значений - то есть, переменные должны быть вычислены во время компиляции и не должны зависеть от информации программы во время выполнения для их вычисления.
В пределах методов класса доступ к нестатическим свойствам может быть получен с помощью -> (объектного оператора): $this->property (где property - имя свойства). Доступ к статическим свойствам может быть получен с помощью :: (двойного двоеточия): self::$property.
Псевдо-переменная $this доступна внутри любого метода класса, когда этот метод вызывается в пределах объекта. $this - это ссылка на вызываемый объект (обычно, объект, которому принадлежит метод, но возможно и другого объекта, если метод вызван статически из контекста второго объекта).
<?php
class SimpleClass
{
// неправильное определение свойств:
public $var1 = 'hello ' . 'world';
public $var2 = <<<EOD
hello world
EOD;
public $var3 = 1+2;
public $var4 = self::myStaticMethod();
public $var5 = $myVar;
// правильное определение свойств:
public $var6 = myConstant;
public $var7 = array(true, false);
// Это разрешено только в PHP 5.3.0 и более поздних версиях.
public $var8 = <<<'EOD'
hello world
EOD;
}
?>
В отличии от heredocs, nowdocs может быть использованы в любом статическом контексте данных, включая определение свойств.
Константы классов
Константы также могут быть объявлены и в пределах одного класса. Отличие переменных и констант состоит в том, что при объявлении последних или при обращении к ним не используется символ $.
Значение должно быть неизменяемым выражением, не (к примеру) переменной, свойством, результатом математической операции или вызовом функции.
Интерфейсы также могут содержать константы (constants).
Клонирование
Создание копии объекта с абсолютно идентичными свойствами не всегда является приемлемым вариантом. Хорошим примером необходимости копирования конструкторов может послужить ситуация, когда у вас есть объект, представляющий собой окно GTK и содержащий ресурс-идентификатор этого окна; когда вы создаете копию этого объекта, вам может понадобиться, чтобы копия объекта содержала ресурс-идентификатор нового окна. Другим примером может послужить ситуация, когда ваш объект содержит ссылку на какой-либо другой используемый объект и, когда вы создаёте копию родительского объекта, вам нужно также создать новый экземпляр этого другого объекта, так, чтобы копия объекта-контейнера содержала собственный отдельный экземпляр содержащегося объекта.
Копия объекта создается с использованием ключевого слова clone (который вызывает метод __clone() объекта, если это возможно). Вызов метода __clone() не может быть осуществлён непосредственно.
<?php
$copy_of_object = clone $object;
?>
При клонировании объекта, PHP 5 выполняет неполную копию всех свойств объекта. Любые свойства, являющиеся ссылками на другие переменные, останутся ссылками.
void __clone ( void )
- По завершении клонирования, если у класса был определен метод __clone(), то этот метод __clone() вызывается у свежесозданной копии объекта, для возможного изменения всех необходимых свойств.
Итераторы объектов
PHP 5 предоставляет такой способ объявления объектов, который дает возможность пройти по списку элементов данного объекта, например, с помощью оператора foreach. По умолчанию, в этом обходе (итерации) будут участвовать все видимые свойства объекта.
Кроме того, вы можете развить эту концепцию и реализовать встроенный в PHP 5 интерфейс Iterator. Это позволит самому объекту решать как он будет итерироваться и какие данные будут доступны на каждой итерации.
Интерфейс IteratorAggregate может быть использован как альтернатива реализации всех методов интерфейса Iterator. IteratorAggregate требует чтобы был реализован только один метод - IteratorAggregate::getIterator(), который должен возвращать экземпляр класса, реализующий интерфейс Iterator.
Функции
class_alias()
- Создает псевдоним alias для пользовательского класса original. Новый класс с псевдонимом будет точно таким же, как и оригинальный класс.
get_class_methods()
- Возвращает массив имен методов класса.
get_class_vars()
- Возвращает объявленные по умолчанию свойства класса.
- Возвращает ассоциативный массив объявленных свойств класса, видимых из текущей области видимости, с их значением по умолчанию. Получившиеся элементы массива имеют форму varname => value.
get_object_vars()
- Возвращает ассоциативный массив нестатических свойств объекта object, доступных в данной области видимости.