O Operador de Resolução de Escopo, também chamado de Paamayim Nekudotayim, ou em termos mais simples, dois pontos duplo, é um token que permite acesso a métodos ou membros estáticos, constantes, e sobrecarregados de uma classe.
Quando referenciando esses itens de fora da definição da classe, você usa o nome da classe.
No 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 (e.g. self, parent e static).
Paamayim Nekudotayim pode parecer, de inicio, uma escolha estranha para um dois pontos duplo. No entanto, na hora de escrever o Engine da Zend 0.5 (que provia o PHP3), 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 MinhaClasse {
const VALOR_CONST = 'Um valor constante';
}
$classname = 'MinhaClasse';
echo $classname::VALOR_CONST; // No PHP 5.3.0
echo MinhaClasse::VALOR_CONST;
?>
Duas palavras-chaves especiais self e parent são usadas para acessar membros ou métodos de dentro da definição da classe.
Exemplo #2 :: de dentro da definição da classe
<?php
class OutraClasse extends MinhaClasse {
public static $meu_estatico = 'variável estática';
public static function doisPontosDuplo() {
echo parent::VALOR_CONST . "\n";
echo self::$meu_estatico . "\n";
}
}
$classname = 'OutraClasse';
echo $classname::doisPontosDuplo(); // No PHP 5.3.0
OutraClasse::doisPontosDuplo();
?>
Quando uma subclasse sobrecarrega a definição de um método do pai, php não chamará o método pai. Fica a cargo da subclasse chamar o método pai ou não. Isso também aplica a definições de métodos Construtores and Destrutores, Sobrecarregados e Mágicos também.
Exemplo #3 Chamando um método pai
<?php
class MinhaClasse {
protected function minhaFuncao() {
echo "MinhaClasse::minhaFuncao()\n";
}
}
class OutraClasse extends MinhaClasse {
/* Sobrecarrega a definição do pai */
public function minhaFuncao() {
/* Mas ainda chama a função pai */
parent::minhaFuncao();
echo "OutraClasse::minhaFuncao()\n";
}
}
$classe = new OutraClasse();
$classe->minhaFuncao();
?>