Каждое определение класса начинается с ключевого слова class, затем следует имя класса, которое может быть любым именем не входящим в список зарезервированных слов PHP. После идет пара фигурных скобок, в которых находится определение свойств и методов класса. Псевдо-переменная $this доступна в том случае, когда метод был вызван в контексте объекта. $this является ссылкой на вызываемый объект. Обычно это тот объект, которому принадлежит вызванный метод, но может быть и другой объект, если метод был вызван статически из контекста другого объекта. Это показано на следующих примерах:
Пример #1 переменная $this в объектно-ориентированном языке
<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this определена (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this не определена.\n";
}
}
}
class B
{
function bar()
{
A::foo();
}
}
$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
?>
Результат выполнения данного примера:
$this определена (a) $this не определена. $this определена (b) $this не определена.
Пример #2 Определение класса Simple Class
<?php
class SimpleClass
{
// объявление свойства
public $var = 'значение по умолчанию';
// объявление метода
public function displayVar() {
echo $this->var;
}
}
?>
Значение по умолчанию должно быть постоянным выражением и не может быть, например, переменной, членом класса или вызовом функции.
Пример #3 Значение свойства класса по умолчанию
<?php
class SimpleClass
{
// неправильное объявление свойств:
public $var1 = 'hello '.'world';
public $var2 = <<<EOD
привет, мир
EOD;
public $var3 = 1+2;
public $var4 = self::myStaticMethod();
public $var5 = $myVar;
// правильное объявление свойств:
public $var6 = myConstant;
public $var7 = self::classConstant;
public $var8 = array(true, false);
}
?>
Замечание: Тут представлены несколько полезных функций для управления классами и объектами. Возможно, вам будет интересно взглянуть на функции Класса/Объекта.
В отличии от heredocs, nowdocs могут быть использованы как статические данные в любом контексте.
Пример #4 Пример использования nowdocs в контексте статических данных
<?php
class foo {
// Для PHP 5.3.0
public $bar = <<<'EOT'
bar
EOT;
}
?>
Замечание: Поддержка nowdocs добавлена в PHP 5.3.0.
Для создания экземпляра класса новый объект должен быть создан и присвоен переменной. Новый объект всегда будет присвоен переменной, за исключением случаев, когда объект имеет конструктор, в котором определен вызов исключения в случае ошибки. Рекомендуется определять классы до создания их экземпляров (в некоторых случаях это уже не рекомендуется, а требуется).
Пример #5 Создание экземпляра класса
<?php
$instance = new SimpleClass();
?>
В контексте класса возможно создать новый объект через new self и new parent.
Когда происходит назначение уже существующего экземпляра класса новой переменной, то это переменная будет иметь доступ к экземпляру класса того объекта, который был назначен. Это поведение будет таким же, как и в случае передачи экземпляра класса в функцию. Копию уже созданного объекта можно создать через клонирование.
Пример #6 Присваивание объекта
<?php
$assigned = $instance;
$reference =& $instance;
$instance->var = '$assigned будет иметь это значение';
$instance = null; // $instance и $reference становятся null
var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>
Результат выполнения данного примера:
NULL NULL object(SimpleClass)#1 (1) { ["var"]=> string(30) "$assigned будет иметь это значение" }
Класс может наследовать методы и свойства другого класса используя ключевое слово extends при декларации. Невозможно наследовать несколько классов, один класс может наследовать только один базовый класс.
Наследуемые методы и свойства могут быть переопределены (за исключением случаев, когда метод класса объявлен как final) путем объявления их с теми же именами, как и в родительском классе. Существует возможность доступа к переопределенным методам или статическим методам путем обращения к ним через parent::
Пример #7 Простое наследование класса
<?php
class ExtendClass extends SimpleClass
{
// Переопределение родительского метода
function displayVar()
{
echo "Расширенный класс\n";
parent::displayVar();
}
}
$extended = new ExtendClass();
$extended->displayVar();
?>
Результат выполнения данного примера:
Расширенный класс значение по умолчанию