Construções da Linguagem PHP

Artigo que explica o que são construções da linguagem PHP, ou recursos nativos da linguagem, e o que eles tem de diferença em relação às funções convencionais.

A linguagem PHP, assim como qualquer linguagem de programação, é formada por construções da linguagem. Além das estruturas básicas de programação (estruturas condicionais, estruturas de repetição, sintaxe para criação de classes, sintaxe para criação de funções, etc.), a linguagem possui algumas funções "built-in", ou seja, funções embutidas no núcleo da linguagem.

Muitos programadores não sabem distinguir algumas destas construções de linguagem de uma função convencional (proveniente de uma biblioteca ou módulo do PHP, ou criada pelo usuário). As construções da linguagem PHP podem ser consultadas na lista de tokens da linguagem. Um token é uma sequência de caracteres que caracteriza uma unidade básica de um código em relação à sintaxe imposta por uma linguagem.

Normalmente, as construções de linguagem tem altíssima performance. Veja alguns exemplos de funções embutidas da linguagem:

  • isset, unset, empty
  • exit
  • return
  • eval
  • include, include_once, require, require_once
  • declare
  • echo, print

Funções embutidas da linguagem não funcionam com o recurso de "funções com nome variável", onde uma função é invocada a partir do nome armazenado em uma variável, como no exemplo:

// Definindo o nome da funcao desejada em $funcao
$funcao = 'strlen';

// Chamando a funcao armazenada em $funcao
$funcao('oi');

Depuração de Erros de Sintaxe

Muitos dos erros com que programadores PHP se deparam é decorrente de um erro de sintaxe. Seja por desconhecimento da linguagem, seja por erro de digitação, seja por alguma desatenção ocasional. Quase sempre que o interpretador PHP encontra um erro de sintaxe, este erro é explicado através de tokens esperados em determinada posição do código. Veja o código abaixo como exemplo:

<?php
$x = 1
$a = 2;

Observe que, propositalmente, montei um código com um erro de sintaxe que é apresentado da seguinte forma:

PHP Parse error: syntax error, unexpected T_VARIABLE in ... on line 4

O significado disso é:

Erro do Parser do PHP: erro de sintaxe, não esperava um token do tipo T_VARIABLE no arquivo ... na linha 4

Isso acontece porque após o "1" (ou antes de "$a"), o interpretador PHP esperava encontrar algum operador (soma, subtração, concatenação, etc.) ou então um ponto-e-vírgula para indicar final de instrução. Mas, ao invés disso, encontrou a variável "$a". Uma variável é um token do PHP cujo código é T_VARIABLE (veja na lista de tokens). Portanto, é caracterizado o erro de sintaxe. Note que a correção não deve ser feita exatamente na linha 4 (e sim na linha 3), mas o problema foi detectado pelo parser na linha 4. Isso também ocorre com frequência quando se esquece de fechar um bloco de string com as aspas. O parser normalmente identifica o problema só no momento em que outra string foi aberta utilizando a mesma aspas, e isso normalmente está em uma linha bem diferente da que ocasionou o erro.

Conhecer os tokens de uma linguagem é fundamental para ter pleno domínio da linguagem (e não deixar "a linguagem lhe dominar"). A segurança que um programador tem em relação a uma linguagem se dá a partir de vários fatores, mas, certamente, o mais fundamental deles é o domínio de seus tokens. É como se o programador tivesse um interpretador de código na cabeça e soubesse exatamente o que pode e o que não pode ser escrito em determinado ponto do código escrito em uma linguagem. Como este processo normalmente é feito na base da tentativa e erro (e lembrança), muitos programadores ficam assustados ao se deparar com um código que não imaginavam ser possível ser válido. Por exemplo, este:

<?php
$f = 'strlen';
${$x .= $x = 'a'} = $f(<<<T
teste
T
);
echo $aa;

Este código é válido e imprime "5". Se você não compreendeu o código, deve estar se perguntando: onde foi que esse cara criou a variável $aa? Basicamente, foi feita uma operação para geração do nome da variável criada na linha 3. A operação "$x .= $x = 'a'" atribui 'a' à variável $x, depois concatena o valor de $x ao valor de $x, resultando em $x valendo "aa". Este resultado é, também, o nome da variável criada através do recurso de "variável com nome variável", na linha 3. Esta variável recebe uma string no formato heredoc com o valor "teste". Por fim, a variável $aa recebe o resultado da função $f (que guarda "strlen") passando-se o parâmetro "teste".


Avaliando os tokens de um código

Para entender bem a questão dos tokens, você não precisa criar um parser de PHP. A linguagem já possui um módulo para isso chamado Tokenizer. O módulo oferece duas funções:

  • token_get_all: para quebrar uma string que armazena um código PHP em um array de tokens.
  • token_name: para obter o nome de um token a partir de seu código numérico correspondente.

Com este módulo, você é capaz de criar um script que recebe outro como parâmetro e exibe ele com destaque de sintaxe. Por exemplo, colocar os "FOREACH" de uma cor, "IF" de outra, etc.


Curiosidade

A função embutida isset pode ser utilizada para melhorar a performance de um código que precisa verificar se um array tem, pelo menos, N elementos.

Ao invés de usar count, que retorna o total de elementos assim:

if (count($array) >= 10) {

você pode usar isset para verificar se a posição 9 existe:

if (isset($array[9])) {

Isso só vale para arrays indexados numericamente a partir de zero e que não possua valores nulos em nenhuma posição. Afinal, quando isset recebe null por parâmetro, retorna false e atrapalharia a lógica proposta. Caso o array possua null, uma alternativa melhor ao count é usar array_key_exists, que verifica se o array possui a posição indicada, independente do valor que tenha.

0 comentários