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

Оператор разрешения области видимости (называемый также 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();
?>

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

To Top