Operador de Resolución de Ámbito (::)

El Operador de Resolución de Ámbito (también denominado Paamayim Nekudotayim) o en términos simples, el doble dos-puntos, es un token que permite acceder a elementos estáticos, constantes, y sobrescribir propiedades o métodos de una clase.

Cuando se hace referencia a estos items desde el exterior de la definición de la clase, se utiliza el nombre de la clase.

A partir de PHP 5.3.0, es posible hacer referencia a una clase usando una variable. El valor de la variable no puede ser una palabra clave (por ej., self, parent y static).

Paamayim Nekudotayim podría, en un principio, parecer una extraña elección para bautizar a un doble dos-puntos. Sin embargo, mientras se escribía el Zend Engine 0.5 (que utilizó PHP 3), asi es como el equipo Zend decidió bautizarlo. En realidad, significa doble dos-puntos - en Hebreo!

Ejemplo #1 :: desde el exterior de la definición de la clase

<?php
class MyClass {
    const 
CONST_VALUE 'Un valor constante';
}

$classname 'MyClass';
echo 
$classname::CONST_VALUE// A partir de PHP 5.3.0

echo MyClass::CONST_VALUE;
?>

Las tres palabras claves especiales self, parent y static son utilizadas para acceder a propiedades y métodos desde el interior de la definición de la clase.

Ejemplo #2 :: desde el interior de la definición de la clase

<?php
class OtherClass extends MyClass
{
    public static 
$my_static 'variable estática';

    public static function 
doubleColon() {
        echo 
parent::CONST_VALUE "\n";
        echo 
self::$my_static "\n";
    }
}

$classname 'OtherClass';
$classname::doubleColon(); // A partir de PHP 5.3.0

OtherClass::doubleColon();
?>

Cuando una clase extendida sobrescribe la definición parent de un método, PHP no invocará al método parent. Depende de la clase extendida el hecho de llamar o no al método parent. Esto también se aplica a definiciones de métodos Constructores y Destructores, Sobrecarga, y Mágicos.

Ejemplo #3 Invocando a un método parent

<?php
class MyClass
{
    protected function 
myFunc() {
        echo 
"MyClass::myFunc()\n";
    }
}

class 
OtherClass extends MyClass
{
    
// Sobrescritura de definición parent
    
public function myFunc()
    {
        
// Pero todavía se puede llamar a la función parent
        
parent::myFunc();
        echo 
"OtherClass::myFunc()\n";
    }
}

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

Véase también algunos ejemplos de trucos de llamadas estáticas .