Оператор разрешения области видимости (::)
Оператор разрешения области видимости (также называемый "Paamayim Nekudotayim") или просто "двойное двоеточие" - это лексема, позволяющая обращаться к статическим свойствам, константам и переопределенным свойствам или методам класса.
При обращении к этим элементам извне класса, необходимо использовать имя этого класса.
Начиная с версии PHP 5.3.0, стало возможным обратиться к классу с помощью переменной.
Значение переменной не должно быть ключевым словом (например, self
,
parent
или static
).
"Paamayim Nekudotayim" на первый взгляд может показаться странным словосочетанием для обозначения двойного двоеточия. Однако, во время создания Zend Engine версии 0.5 (который входил в PHP3), команда Zend выбрала именно это обозначение. Оно на самом деле означает "двойное двоеточие" - на иврите!
Пример #1 Использование :: вне объявления класса
<?php
class MyClass {
const CONST_VALUE = 'Значение константы';
}
$classname = 'MyClass';
echo $classname::CONST_VALUE; // Начиная с PHP 5.3.0
echo MyClass::CONST_VALUE;
?>
Для обращения к свойствам и методам внутри самого класса используются ключевые слова self, parent и static.
Пример #2 Использование :: внутри объявления класса
<?php
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 Обращение к методу в родительском классе
<?php
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();
?>
См. также некоторые примеры статических вызовов.