Operador de Resolução de Escopo (::)
O Operador de Resolução de Escopo (também chamado de Paamayim Nekudotayim), ou em
termos mais simples, dois pontos duplo, é um símbolo que permite acesso a
métodos ou propriedades estáticas,
constantes, e sobrecarregadas
de uma classe.
Ao referenciar estes itens fora da definição da classe, use
o nome da classe.
É possível referenciar a classe usando a variável.
O valor da variável não pode ser uma palavra-chave (por exemplo, self
,
parent
e static
).
Paamayim Nekudotayim pode parecer, de início, uma escolha estranha para chamar
dois pontos duplo. No entanto, na hora de escrever a Zend Engine 0.5
(que provia o PHP 3), foi o que a equipe da Zend decidiu.
Realmente significa dois pontos duplo - em Hebreu!
Exemplo #1 :: de fora da definição da classe
<?php
class MyClass {
const CONST_VALUE = 'Um valor constante';
}
$classname = 'MyClass';
echo $classname::CONST_VALUE;
echo MyClass::CONST_VALUE;
?>
Três palavras-chave especiais self, parent e
static, são utilizadas para acessar propriedades e métodos dentro
de uma definição de classe.
Exemplo #2 :: de dentro da definição da classe
<?php
class OtherClass extends MyClass
{
public static $my_static = 'variável estática';
public static function doubleColon() {
echo parent::CONST_VALUE . "\n";
echo self::$my_static . "\n";
}
}
$classname = 'OtherClass';
echo $classname::doubleColon();
OtherClass::doubleColon();
?>
Quando uma subclasse sobrecarrega a definição de um método do pai,
o PHP não chamará o método pai. Fica a cargo da subclasse
chamar o método pai ou não. Isso também se aplica a definições de métodos Construtores e Destrutores, de Sobrecarga e Mágicos.
Exemplo #3 Chamando um método pai
<?php
class MyClass
{
protected function myFunc() {
echo "MyClass::myFunc()\n";
}
}
class OtherClass extends MyClass
{
// Sobrescreve e definição da classe estendida
public function myFunc()
{
// Mas ainda consegue chamar o método na classe herdada
parent::myFunc();
echo "OtherClass::myFunc()\n";
}
}
$class = new OtherClass();
$class->myFunc();
?>
Veja também outros exemplos de
chamadas estáticas mais complexas.