Forum und email

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 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. Palavras chaves como self, parent ou static não são permitidos em referências dinâmicas à classes.

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!

Example#1 :: de fora da definição da classe

<?php
class MinhaClasse {
  const 
VALOR_CONST 'Um valor constante';
}

$classname 'MinhaClasse';
echo 
$classname::VALOR_CONST;

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.

Example#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();

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.

Example#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();
?>