El operador de resolución de ámbito (::)
El operador de resolución de ámbito (también llamado Paamayim Nekudotayim) o,
en términos más simples, el símbolo "doble dos puntos" (::),
proporciona un medio para acceder a los miembros
una constante,
una propiedad estática,
o un método estático
de una clase o de una de sus clases padre.
Además, las propiedades o métodos estáticos pueden ser sobrecargados vía
la ligadura estática tardía.
Cuando se hace referencia a estos elementos fuera de la definición de
la clase, se utiliza el nombre de la clase.
Es posible referenciar una clase utilizando
una variable. El valor de la variable no puede ser una palabra clave (e.g. self
,
parent
y static
).
Paamayim Nekudotayim podría parecer al principio una elección extraña
para nombrar un doble dos puntos.
Sin embargo, en el momento de la escritura del Zend Engine 0.5
(que hacía funcionar PHP 3), fue el nombre elegido por el equipo Zend.
De hecho, esto significa un doble dos puntos... ¡en hebreo!
Ejemplo #1 :: fuera de la definición de la clase
<?php
class MyClass {
const CONST_VALUE = 'Un valor constante';
}
$classname = 'MyClass';
echo $classname::CONST_VALUE;
echo MyClass::CONST_VALUE;
?>
Tres palabras clave especiales, self, parent,
y static son utilizadas para acceder a las propiedades o a
los métodos desde la definición de la clase.
Ejemplo #2 :: desde la definición de la clase
<?php
class MyClass {
const CONST_VALUE = 'Un valor constante';
}
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();
OtherClass::doubleColon();
?>
Cuando una clase que hereda de otra redefine un método de su clase padre,
PHP no llamará al método de la clase padre. Es responsabilidad del método derivado
llamar al método original en caso de necesidad. Esto también es válido
para las definiciones de los constructores y destructores,
la sobrecarga, y las
definiciones de métodos mágicos.
Ejemplo #3 Llamada a un método padre
<?php
class MyClass
{
protected function myFunc() {
echo "MyClass::myFunc()\n";
}
}
class OtherClass extends MyClass
{
// Sobrecarga de la definición padre
public function myFunc() {
// Pero llamada al método padre
parent::myFunc();
echo "OtherClass::myFunc()\n";
}
}
$class = new OtherClass();
$class->myFunc();
?>
Ver también algunos
ejemplos de llamadas estáticas.