array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'ru', ), 'this' => array ( 0 => 'language.oop5.paamayim-nekudotayim.php', 1 => 'Оператор разрешения области видимости (::)', ), 'up' => array ( 0 => 'language.oop5.php', 1 => 'Классы и объекты', ), 'prev' => array ( 0 => 'language.oop5.inheritance.php', 1 => 'Наследование', ), 'next' => array ( 0 => 'language.oop5.static.php', 1 => 'Ключевое слово static', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'ru', 'path' => 'language/oop5/paamayim-nekudotayim.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
Оператор разрешения области видимости (называемый также 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();
?>
Смотрите также некоторые примеры статических вызовов.