PHP/operators/Оператор разрешения области видимости

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск

Оператор разрешения области видимости (также «Paamayim Nekudotayim») или просто «двойное двоеточие» (::) — лексема, позволяющая обращаться к статическим свойствам, константам и переопределенным свойствам или методам класса.

При обращении к этим элементам извне класса, необходимо использовать имя этого класса.

Начиная с версии PHP 5.3.0, стало возможным обратиться к классу с помощью переменной. Значение переменной не должно быть ключевым словом (напр., self, parent или static).

Этимология

«Paamayim Nekudotayim» на первый взгляд может показаться странным словосочетанием для обозначения двойного двоеточия. Однако, во время создания Zend Engine версии 0.5 (который входил в PHP3), команда Zend выбрала именно это обозначение. Оно на самом деле означает «двойное двоеточие» — на иврите.

Примеры

Пример №1. Использование :: вне объявления класса:

class MyClass {
    const CONST_VALUE = 'Значение константы';
}
$classname = 'MyClass';
echo $classname::CONST_VALUE; // Начиная с PHP 5.3.0
echo MyClass::CONST_VALUE;

Для обращения к свойствам и методам внутри самого класса используются ключевые слова self, parent и static.


Пример №2. Использование :: внутри объявления класса:

class OtherClass extends MyClass {
    public static $my_static = 'статическая переменная';
    public static function doubleColon() {
        echo parent::CONST_VALUE . "\n";
        echo self::$my_static . "\n";
    }
}
$classname = 'OtherClass';
$classname::doubleColon(); // Начиная с версии PHP 5.3.0
OtherClass::doubleColon();

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


Пример №3. Обращение к методу в родительском классе:

class MyClass {
    protected function myFunc() {
        echo "MyClass::myFunc()\n";
    }
}
class OtherClass extends MyClass {
    // Переопределить родительское определение
    public function myFunc() {
        // Но все еще вызываем родительскую функцию
        parent::myFunc();
        echo "OtherClass::myFunc()\n";
    }
}
$class = new OtherClass();
$class->myFunc();