Основы


class

Каждое определение класса начинается с ключевого слова class, затем следует имя класса, и далее пара фигурных скобок, которые заключают в себе определение свойств и методов этого класса.

Именем класса может быть любое слово, при условии, что оно не входит в список зарезервированных слов PHP, начинается с буквы или символа подчеркивания и за которым следует любое количество букв, цифр или символов подчеркивания. Если задать эти правила в виде регулярного выражения, то получится следующее выражение: ^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$.

Класс может содержать собственные константы, переменные (называемые свойствами) и функции (называемые методами).

Пример #1 Простое определение класса

<?php
class SimpleClass
{
    
// объявление свойства
    
public $var 'значение по умолчанию';

    
// объявление метода
    
public function displayVar() {
        echo 
$this->var;
    }
}
?>

Псевдо-переменная $this доступна в том случае, если метод был вызван в контексте объекта. $this является ссылкой на вызываемый объект. Обычно это тот объект, которому принадлежит вызванный метод, но может быть и другой объект, если метод был вызван статически из контекста другого объекта. Это показано на следующих примерах:

Пример #2 Переменная $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()
    {
        
// Замечание: следующая строка вызовет предупреждение, если включен параметр E_STRICT.
        
A::foo();
    }
}

$a = new A();
$a->foo();

// Замечание: следующая строка вызовет предупреждение, если включен параметр E_STRICT.
A::foo();
$b = new B();
$b->bar();

// Замечание: следующая строка вызовет предупреждение, если включен параметр E_STRICT.
B::bar();
?>

Результат выполнения данного примера:

 $this определена (A) $this не определена. $this определена (B) $this не определена. 

new

Для создания экземпляра класса используется директива new. Новый объект всегда будет создан, за исключением случаев, когда он содержит конструктор, в котором определен вызов исключения в случае ошибки. Рекомендуется определять классы до создания их экземпляров (в некоторых случаях это обязательно).

Если с директивой new используется строка (string), содержащая имя класса, то будет создан новый экземпляр этого класса. Если имя находится в пространстве имен, то оно должно быть задано полностью.

Пример #3 Создание экземпляра класса

<?php
$instance 
= new SimpleClass();

// Это же можно сделать с помощью переменной:
$className 'Foo';
$instance = new $className(); // Foo()
?>

В контексте класса можно создать новый объект через new self и new parent.

Когда происходит присвоение уже существующего экземпляра класса новой переменной, то эта переменная будет указывать на этот же экземпляр класса. Тоже самое происходит и при передаче экземпляра класса в функцию. Копию уже созданного объекта можно создать через ее клонирование.

Пример #4 Присваивание объекта

<?php

$instance 
= new SimpleClass();

$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 будет иметь это значение" } 

В PHP 5.3.0 введены несколько новых методов создания экземпляров объекта:

Пример #5 Создание новых объектов

<?php
class Test
{
    static public function 
getNew()
    {
        return new static;
    }
}

class 
Child extends Test
{}

$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);

$obj3 Test::getNew();
var_dump($obj3 instanceof Test);

$obj4 Child::getNew();
var_dump($obj4 instanceof Child);
?>

Результат выполнения данного примера:

 bool(true) bool(true) bool(true) 

extends

Класс может наследовать методы и свойства другого класса используя ключевое слово extends при его описании. Невозможно наследовать несколько классов, один класс может наследовать только один базовый класс.

Наследуемые методы и свойства могут быть переопределены (за исключением случаев, когда метод класса объявлен как final) путем объявления их с теми же именами, как и в родительском классе. Существует возможность доступа к переопределенным методам или статическим методам путем обращения к ним через parent::

Когда переопределяются методы число и типы аргументов должны оставаться такими же как и были, иначе PHP вызовет ошибку уровня E_STRICT. Это не относится к конструктору, который можно переопределить с другими параметрами.

Пример #6 Простое наследование классов

<?php
class ExtendClass extends SimpleClass
{
    
// Переопределение метода родителя
    
function displayVar()
    {
        echo 
"Расширенный класс\n";
        
parent::displayVar();
    }
}

$extended = new ExtendClass();
$extended->displayVar();
?>

Результат выполнения данного примера:

 Расширенный класс значение по умолчанию 

::class

Начиная с версии PHP 5.5 можно использовать ключевое слово class для разрешения имени класса. С помощью конструкции ClassName::class можно получить строку с абсолютным именем класса ClassName. Обычно это довольно полезно при работе с классами, использующими пространства имен.

Пример #7 Разрешение имени класса

<?php
namespace NS {
    class 
ClassName {
    }

    echo 
ClassName::class;
}
?>

Результат выполнения данного примера:

 NS\ClassName