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.
A partir do PHP 5.3.0, é possível referenciar o nome da classe usando uma 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; // A partir do PHP 5.3.0
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(); // A partir do PHP 5.3.0
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.