Оператор разрешения области видимости (::)

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

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

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

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

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

<?php
class MyClass {
const
CONST_VALUE = 'Значение константы';
}

$classname = 'MyClass';
echo
$classname::CONST_VALUE;

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();

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();
?>

Смотрите также некоторые примеры статических вызовов.