Expressões

Expressões são os blocos de construção mais importantes do PHP. No PHP, quase tudo o que você escreve são expressões. A maneira mais simples e ainda mais precisa de definir uma expressão é "tudo o que tem um valor".

As formas mais básicas de expressões são constantes e variáveis. Quando você digita $a = 5, você está atribuindo 5 dentro de $a. 5 obviamente tem o valor 5, ou em outras palavras 5 é uma expressão com o valor de 5 (nesse caso 5 é uma constante inteira).

Depois desta atribuição, você pode esperar que o valor de $a seja 5 também, assim se você escrever $b = $a, você pode esperar que ele se comporte da mesma forma que se você escrevesse $b = 5. Em outras palavras, $a é uma expressão com valor 5 também. Se tudo funcionou bem isto é exatamente o que aconteceu.

Exemplos ligeiramente mais complexos para expressões são as funções. Por exemplo, considere a seguinte função:

<?php
function foo ()
{
    return 5;
}
?>

Assumindo que você está familiarizado com o conceito de funções (se não estiver, dê uma olhada no capítulo sobre funções), você pode assumir que digitar $c = foo() é essencialmente a mesma coisa que escrever $c = 5, e você está certo. Funções são expressões com o valor igual ao seu valor de retorno. Como foo() retorna 5, o valor da expressão 'foo()' é 5. Geralmente, as funções não retornam apenas um valor estático, mas computam algo.

Claro, valores em PHP não tem que ser inteiros, e muito comumente eles não são. O PHP suporta quatro tipos de valores escalares: valores int (inteiros), valores de ponto flutuante (float), valores string (caracteres) e valores bool (booleano) (valores escalares são valores que você não pode partir em peças menores, diferentemente de matrizes, por exemplo). O PHP também suporta dois tipos compostos (não escalar): matrizes e objetos. Cada um desses valores podem ser definidos em uma variável ou retornados de uma função.

O PHP leva as expressões muito além, da mesma maneira que muitas outras linguagens fazem. O PHP é uma linguagem orientada a expressões, no sentido de que quase tudo são expressões. Considere o exemplo com o qual já lidamos, $a = 5. É fácil ver que há dois valores envolvidos aqui, o valor da constante inteira 5, e o valor de $a que está sendo atualizado para 5 também. Mas a verdade é que há um valor adicional envolvido aqui, e que é o próprio valor da atribuição. A própria atribuição é avaliada com o valor atribuído, neste caso 5. Na prática, significa que $a = 5, independente do que faça, é uma expressão com o valor 5. Portanto, escrever algo como $b = ($a = 5) é como escrever $a = 5; $b = 5; (um ponto-e-vírgula marca o fim do comando). Como atribuições são analisadas da direita para a esquerda, você também pode escrever $b = $a = 5.

Outro bom exemplo de orientação de expressão é o pré e o pós-incremento e decremento. Usuários de PHP 2 e muitas outras linguagens podem estar familiarizados com a notação de variable++ e variable--. Este são operadores de incremento e decremento. Em PHP, como em C, há dois tipos de incremento - pré-incremento e pós-incremento. Tanto o pré-incremento quanto o pós-incremento, essencialmente, incrementam as variáveis, e o efeito sobre a variável é idêntico. A diferença é com o valor da expressão de incremento. O pré-incremento, que é escrito ++$variable', é avaliado como o valor de incremento (o PHP incrementa a variável antes de ler seu valor, por isso o nome pré-incremento). O pós-incremento, que é escrito $variable++ é avaliado como o valor original de $variable, antes de ser incrementada (o PHP incrementa a variável depois de ler seu valor, por isso o nome 'pós-incremento').

Um tipo muito comum de expressões são expressões de comparação. Estas expressões avaliam para ser false ou true. O PHP suporta > (maior que), >= (maior ou igual a), == (igual), != (diferente), < (menor que) e <= (menor ou igual a). A linguagem também suporta um conjunto de operador de equivalência estrita: === (igual a e do mesmo tipo) e !== (diferente de ou não do mesmo tipo). Estas expressões são mais comumente usada dentro de execução condicional como comandos if.

O último exemplo de expressões com que nós vamos lidar aqui são as expressões combinadas operador-atribuição. Você já sabe que se você quer incrementar $a de 1, você só precisa escrever $a++ ou ++$a. Mas e se você quiser somar mais que um a ele, por exemplo 3? Você poderia escrever $a++ várias vezes, mas esta obviamente não é uma forma muito eficiente ou confortável. Uma prática muito mais comum é escrever $a = $a + 3. $a + 3 é avaliada como o valor de $a mais 3, e é atribuído de volta a $a, que resulta em incrementar $a em 3. Em PHP, como em várias outras linguagens como o C você pode escrever isto de uma forma mais curta, que com o tempo se torna mais limpa e rápida de se entender. Somar 3 ao valor corrente de $a pode ser escrito $a += 3. Isto significa exatamente "pegue o valor de $a, some 3 a ele, e atribua-o de volta a $a." Além de ser mais curto e mais limpo, isto também resulta em execução mais rápida. O valor de $a += 3, como o valor de uma atribuição regular, é o valor atribuído. Note que NÃO é 3, mas o valor combinado de $a mais 3 (este é o valor que é atribuído a $a). Qualquer operador de dois parâmetros pode ser usado neste modo operador-atribuição, por exemplo $a -= 5 (subtrai 5 do valor de $a), $b *= 7 (multiplica o valor de $b por 7), etc.

Há mais uma expressão que podem parecer estranha se você não a viu em outras linguagens, o operador condicional ternário:

<?php
$primeira ? $segunda : $terceira
?>

Se o valor da primeira sub-expressão é verdadeiro (true, não-zero), então a segunda sub-expressão é avaliada, e este é o resultado da expressão condicional. Caso contrário, a terceira sub-expressão é avaliada e este é o valor.

O seguinte exemplo deve ajudá-lo a entender um pouco melhor pré e pós-incremento e expressões em geral:

<?php
function double($i)
{
    return $i*2;
}
$b = $a = 5;        /* atribui o valor cinco às variáveis $a e $b */
$c = $a++;          /* pós-incremento, atribui o valor original de $a
                       (5) para $c */
$e = $d = ++$b;     /* pré-incremento, atribui o valor incrementado de
                       $b (6) a $d e $e */

/* neste ponto, tanto $d quanto $e são iguais a 6 */

$f = double($d++);  /* atribui o dobro do valor de $d antes
                       do incremento, 2*6 = 12 a $f */
$g = double(++$e);  /* atribui o dobro do valor de $e depois
                       do incremento, 2*7 = 14 a $g */
$h = $g += 10;      /* primeiro, $g é incrementado de 10 e termina com o
                       valor 24. o valor da atribuição (24) é
                       então atribuído a $h, e $h termina com o valor
                       24 também. */
?>

Algumas expressões podem ser consideradas instruções. Neste caso, uma instrução na forma 'expr ;' ou seja, uma expressão seguida de um ponto e vírgula. Em $b = $a = 5;, $a = 5 é uma expressão válida, mas não é um comando por si só. $b = $a = 5; porém é um comando válido.

Uma última coisa que vale mencionar é o valor-verdade de expressões. Em muitos eventos, principalmente em instruções condicionais e loops, você não está interessado no valor específico da expressão, mas somente se ela significa true ou false (o PHP não tem um tipo booleano dedicado). As constantes true e false (insensitivas ao caso) são seus dois valores booleanos possíveis. Às vezes uma expressão é automaticamente convertida para um booleano. Veja a seção sobre type-casting para detalhes de como isso é feito.

O PHP fornece uma implementação completa e poderosa de expressões, e a completa documentação dela vai além do escopo deste manual. Os exemplos acima devem dar a você uma boa ideia sobre o que são as expressões e como você pode construir expressões úteis. Através do restante do manual nós escreveremos expr (ou expressão) para indicar qualquer expressão PHP válida.