PHP para Iniciantes: Operadores - Precedência

A essa altura dos artigos, você já deve saber que os operadores servem para dizer ao interpretador qual operação deve ser executada. A nível de execução, a ordem que os operadores forem convertidos em instruções de máquina é o que define qual comando será executado primeiro. Mas como o interpretador consegue definir qual deve ser lido primeiro?

Por exemplo, supondo que seu almoço já está pronto, o que você precisa fazer para começar a comer?

  • Colocar o alimento no prato;
  • Pegar um prato;
  • Pegar talheres.

Não necessariamente nessa ordem, certo? Você, como interpretador das execuções, tem uma ordem específica. Eu não sei qual, mas provavelmente você primeiro pega o prato para poder colocar o alimento nele. Essa definição sobre qual operação precisa ser executada primeiro é chamada de precedência.

  • O que executo primeiro? - refletiu o PHP.

O problema de precedência indefinida pode ser facilmente resolvido ao encapsular cada operador e seus argumentos em grupos. Nós podemos ver com clareza essa estratégia em contas matemáticas:

$a + $b * $c
=>
($a + ($b * $c))
=>
{
$bc = ($b * $c)
$abc = ($a + $bc)
}

Ah, Kiko, e se eu quisesse fazer a soma antes?

Force um grupo com ela antes, ora!

($a + $b) * $c
=>
(($a + $b) * $c)
=>
{
$ab = $a + $b
$cab = $ab * $c
}

Resumindo: você, que está escrevendo a instrução, pode definir a ordem de execução de cada operador. Mas isso não é obrigatório, por isso criamos uma definição sólida da ordem de precedência de cada operador nativo em cada linguagem. PHP não poderia ser diferente!

Dito isso, a principal informação que você precisa saber sobre esse assunto pode ser encontrado em uma tabela mostrando todos os operadores da linguagem em ordem de prioridade de precedência (do mais prioritário pro menos), na intenção de te mostrar qual operador será executado primeiro durante a interpretação do script.

Essa tabela está presente na documentação oficial do PHP. Por favor, dê uma lida na tabela antes de continuar essa leitura, ok?

Kiko, uma das colunas da tabela fala sobre associação. O que é isso?

É um indicador para que o interpretador saiba qual lado da instrução precisa ser interpretado primeiro para resolver as questões daquele operador específico. No caso, temos as seguintes possibilidades:

  • esquerda: o operador é associado ao dado à esquerda. Se o dado for um grupo de instruções () ou mais prioritário que ele, ele usará o resultado dos dados para se associar;
  • direita: o operador é associado ao dado à direita. (...);
  • não associativo: o operador não se associa a nenhum dado, apenas é acionado quando chega sua vez (no caso, pode ser mais prioritário que outros, mas caso empate com outro prioritário, deixará que o interpretador execute o que veio primeiro).

E com isso, temos uma pegadinha:

$a = true and falsetrue ou false?

Pensou em false? Você não está errado, mas ao mesmo tempo está:

<?php
var_dump($a = true and false); // false
var_dump($a); //true

Temos aqui o Gato de Schrodinger da programação! Uma hora dá false, outra dá true...

Que bruxaria é essa, Kiko?

Bem, se você der uma olhada na tabela da ordem de precedência do PHP, verá que o operador de atribuição = tem mais prioridade do que o operador and. Isso significa que o interpretador executa o = primeiro!!

Com isso, $a recebe o valor true. Depois disso, sobra somente $a and false, ficando false. Ou seja, o script anterior é o mesmo que fazer isso:

<?php
var_dump(($a = true) and false); // false
var_dump($a); // true

Uma bela pegadinha, não? Por isso gosto sempre de colocar as operações em grupos, para ficar bem definido o que eu quero:

<?php
var_dump($a = (true and false)); // false
var_dump($a); // false

De forma similar, um $a = false or true daria o mesmo cenário:

<?php
var_dump($a = false or true); // true
var_dump($a); // false

E aí, conseguiu entender a importância de estudar a ordem de precedência dos operadores? Se sim, comenta aí mente precede o corpo e bora ver um iogas compartilha com os amigos! No próximo artigo, falaremos sobre operadores aritméticos, explicando o que cada um faz e dando algum contexto sobre onde você pode aplicá-los e onde não é interessante aplicar. Bora?

Inté!