Syntax Error, Unexpected T_PAAMAYIM_NEKUDOTAYIM – RESOLVIDO
Syntax Error, Unexpected T_PAAMAYIM_NEKUDOTAYIM – RESOLVIDO
Esse é um erro que pode deixar muitos desenvolvedores de cabelos em pé. O fato mais terríbel deste erro é que ele ocorre em determinados servidores web e já em outros não, isso significa que um script que você já tenha testado e confirmado que está totalmente funcional, uma vez que instalado em outro servidor web poderá exibir esse erro: “Syntax Error, Unexpected T_PAAMAYIM_NEKUDOTAYIM”. Mas o que é esse erro? Por que ele ocorre? Como solucionar esse problema? Bem, bem, fique tranquilo que no decorrer deste artigo irei explicar tudo que você precisa saber sobre este erro malvado.
A primeira coisa a se notar é que é um erro de sitaxe. Mas como pode se funcionou em outro servidor? Veja bem, cada servidor é diferente um do outro, cada um tem suas próprias configurações e versões de aplicações. O erro Syntax Error, Unexpected T_PAAMAYIM_NEKUDOTAYIM ocorre quando você utiliza uma sintaxe de acesso a uma propriedade de uma determinada classe não suportada pela versão do PHP do Servidor. Isso explica o motivo do teu script funcionar em um servidor e exibir este erro em outro. A sintaxe de acesso a uma propriedade de um objeto ou classe utilizando os dois pontos duplos (::) só é suportada a partir da versão 5.3 do PHP, então se você tentar “rodar” um script com esta sintaxa em um servidor que possua uma versão do PHP inferior à 5.3, o bendito erro irá ocorrer. Vejamos como reproduzir o erro:
class Musica{
const NOTAS = '7';
const ESCALA = "DO";
public static $notas = '7';
}
$obj = new Musica();
echo $obj::NOTAS;
echo $obj::$notas;
As duas linhas abaixo é que irão gerar o erro “Unexpected T_PAAMAYIM_NEKUDOTAYIM”:
echo $obj::NOTAS; echo $obj::$notas;
Note porém que se você acessar o valor de uma constante ou de uma variável estática de dentro da classe, mesmo utilizando os dois pontos, o erro não mais ocorrerá. Por exemplo, o código abaixo utiliza a sintaxe dos dois pontos duplos (::) e funciona normalmente:
class Musica{
const NOTAS = '7';
const ESCALA = "DO";
public static $notas = '7';
public function Musica(){
echo self::NOTAS;
echo self::$notas;
}
}
$obj = new Musica();
Interessante isso, não? Dar essa opção de acesso quando de dentro da classe e não permitir essa sintaxe a partir de um objeto instanciado ou mesmo a partir do nome da classe Musica::NOTAS chega a ser um desserviço, não é a toa que na versão 5.3 do PHP essa sintaxe passou a ser suportada.
Como resolver o erro Syntax Error, Unexpected T_PAAMAYIM_NEKUDOTAYIM
Conheço duas formas, a saber:
1) Atualizar a versão do PHP do Servidor Web para a versão 5.3 ou uma versão Superior.
2) Criar uma Função que retorne o falor para nós, veja abaixo como ficaria essa idéia:
class Musica{
const NOTAS = '7';
public static $NOTAS = self::NOTAS;
const ESCALA = "DO";
public static $ESCALA = self::ESCALA;
public static $notas = '7';
public function pega_constante($constante){
return self::$$constante;
}
}
$obj = new Musica();
echo $obj->pega_constante("NOTAS");
echo $obj->pega_constante("notas");
echo $obj->pega_constante("ESCALA");
Um detalhe é que, para cada constante, eu criei uma variável estática com o mesmo nome da constante e fiz uso do self:: para atribuir a essa variável estática o valor da respectiva constante. Se você precisa obter o valor de uma variável estática invés do valor de uma constante, basta passar o nome da variável para a função pega_constante.
Caso você não queira instanciar um objeto, você pode usar a função call_user_func, veja como ficaria:
echo call_user_func(array('Musica','pega_constante'),'ESCALA');
A função do PHP call_user_func permite você executar funções que você tenha criado, mesmo que a função desejada seja um método de uma classe. Quando você quer executar um método de uma classe, você deve passar um array – com o primeiro valor sendo o nome da classe e o segundo o método a ser invocado – como primeiro parâmetro e o valor a ser passado como parâmetro para o método como segundo parâmetro da função call_user_func.
Com essa idéia conseguimos acessar valores de constantes e variáveis estáticas sem gerar o bendito erro: T_PAAMAYIM_NEKUDOTAYIM, seja instanciando um objeto, seja sem instanciá-lo.
Fica aí a dica.
Até o próximo artigo aqui no Livro PHP.












