Você está aqui: Home / syntax error unexpected t_paamayim_nekudotayim resolvido

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.


    

Gostou? Compartilhe com seus amigos!

    Deixe um Comentário

    O seu endereço de email não será publicado Campos obrigatórios são marcados *

    *

    Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

    Receba Novidades no Email

    Artigos Populares do Mês