Классы и объекты PHP

После выхода PHP5 поддержка Три свойства ООП Объектно-ориентированное программирование в PHP стала практически полной.

Имя класса в PHP регистрозависимо.
Объекты всегда передаются в функцию по ссылке.
  • Различия между передачей по ссылке объектов и обычных переменных в PHP версий 5.x.
    $var1 = 10;
    // $var2 - копия текущего состояния переменной $var1
    $var2 = $var1;
    // $var3 - жесткая ссылка на $var1, дальнейшее изменение значения одной из
    // них отразится на значении второй
    $var3 = &$var1;
     
    $obj1 = new MyClass();
    $obj2 = clone $obj1; // $obj2 - копия текущего состояния $obj1
    $obj3 = $obj1;	     // $obj3 - жесткая ссылка на $obj1

$this,parent,self,::

  • $this - это псевдопеременная, указывающая на объект класса (ссылка на вызываемый объект), она доступна в том случае, если метод был вызван в контексте объекта и вы хотите указать, что работаете с локальным свойством текущего объекта. Обычно это тот объект, которому принадлежит вызванный метод, но может быть и другой объект, если метод был вызван статически из контекста другого объекта. Если вы не создаете объектов класса, ваш класс статический, переменная работать $this не будет. При проектировании методов, которые обращаются к внутренним членам(методам) класса, необходимо следить за тем, что к членам(методам) класса следует обращаться через префикс $this, а при обращении к параметрам метода данный пре­фикс не требуется. В большинстве случаев интерпретатор РНР не сообщит о наличии ошибок, если при обращении к внутреннему члену класса не ис­пользуется префикс $this, а при обращении к параметру метода префикс $this используется. При этом будет создана новая переменная с нулевым значением . Эта ошибка очень распространена и связана с фундаментальной особенностью РНР - отсутствием типизации: использование переменной с любым именем приводит к созданию переменной с этим именем. К статическим членам класса нельзя обращаться через $this.
  • Ключевое слово parent используется для обращения только к родительским членам. Если дочерний класс замещает родительский метод, то родительскую версию можно вызвать только так.
  • Оператор области видимости (scope resolution) :: (два двоеточия рядом) используется для доступа к статическим или переопределенным методам класса, например для вызова конструктора класса-родителя из класса-потомка
    parent::__construct()
  • Ключевое слово self - указатель на сам класс, в отличии от $this, который является указателем на объект класса. Методы класса не видят других членов класса. Для обращения к членам своего класса, включая наследуемые, используется ключевое слово self.
    • Обращение к статическому методу или свойству в классе: self::method()
    • Обращение к статическому методу или свойству из вне класса: ClassName::method()

Специальные методы класса

Специальные методы класса: construct(), destruct(), clone() и т.д. Каждый специальный метод предваряется двумя символами подчеркивания.

  • Клонирование объектов в PHP 5 происходит при помощи ключевого слова clone. При клонировании конструктор НЕ вызывается, но если нужно при клонировании использовать конструктор - описывается метод clone(). Пример клонирования: car2 = clone car1;, если написать так car2 = car1; в этом случае car2 будет просто ссылкой на car1.

Функции для работы с методами и классами

  • get_class_medhods($class_name) - Возвращает массив с именами методов класса $class_name.
    $class_methods = get_class_methods(new MyClass());
    print_r($class_methods);

Примеры

  • Счетчик объектов
    <?php
     
    error_reporting(E_ALL & ~E_NOTICE);
     
    class counter {
     
        public static $count = 0;
     
        public function __construct() {
            self::$count++; // идентично counter::$count++;
        }
     
        public function __destruct() {
            self::$count--; // идентично counter::$count--;
        }
     
    }
     
    $obj = new counter();
    echo counter::$count . "\n"; // 1
     
    for ($i = 0; $i < 3; $i++) {
        $arr[] = new counter();
        echo counter::$count . "\n"; // 2, 3, 4
    }
     
    unset($arr); // уничтожение массива объктов
    echo counter::$count . "\n"; // 1
    ?>
PQ VPS сервера в 28+ странах.