Scope Resolution Operator (::)

Оновлено: 09.05.2023

Оператор визначення області видимості (також званий Paamayim Nekudotayim) або, простіше кажучи, подвійна двокрапка - це токен, який дозволяє отримати доступ до статичних, константних та перевизначених властивостей або методів класу.

При посиланні на ці елементи поза визначенням класу, використовуйте ім'я класу.

На клас можна посилатися за допомогою змінної. Значення змінної не може бути ключовим словом (наприклад, self, parent та static).

Paamayim Nekudotayim, на перший погляд, може здатися дивним вибором для назви подвійної двокрапки. Однак, під час написання Zend Engine 0.5 (на якому працює PHP 3), команда Zend вирішила назвати його саме так. Це дійсно означає подвійну двокрапку - на івриті!

Приклад #1 :: ззовні оголошення класу

<?php
class MyClass {
    const CONST_VALUE = 'A constant value';
}

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

echo MyClass::CONST_VALUE;
?>

Три спеціальні ключові слова self, parent і static використовуються для доступу до властивостей або методів зсередини визначення класу.

Приклад #2 :: зсередини оголошення класу

<?php
class OtherClass extends MyClass
{
    public static $my_static = 'static var';

    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
{
    // Override parent's definition
    public function myFunc()
    {
        // But still call the parent function
        parent::myFunc();
        echo "OtherClass::myFunc()\n";
    }
}

$class = new OtherClass();
$class->myFunc();
?>

Дивіться також деякі приклади обману статичних викликів.