Оператор разрешения области действия ::
Оператор разрешения области действия, который ещё называется Paamayim Nekudotayim,
или «двойное двоеточие», — токен, который разрешает доступ
к константе,
статическому свойству
или статическому методу
текущего или родительского класса.
Больше того, статические свойства и методы разрешается переопределять
через позднее статическое связывание.
При обращении к элементам класса извне определения класса указывают название класса.
К классу возможно обратиться через переменную, при этом
нельзя указывать как значение переменной ключевые слова наподобие self
,
parent
или static
.
Вначале словосочетание Paamayim Nekudotayim кажется странным
выбором для названия двойного двоеточия.
Команда Zend назвала оператор так,
пока писала движок Zend Engine версии 0.5, на котором работал PHP 3.
Секрет в том, что эти слова и переводятся как «двойное двоеточие» — с иврита!
Пример #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();
?>
Смотрите также
примеры статических вызовов.