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 .