gratiszona

Expresiones

Las formas mas basicas de expresiones son las constantes y las variables. Cuando escribes "$a = 5", estas asignando ’5’ a
$a. ’5’, obviamente, tiene el valor 5 o, en otras palabras ’5’ es una expresion con el valor 5 (en este caso, ’5’ es una
constante entera).
despues de esta asignacion, esperaras que el valor de $a sea 5 tambien, de manera que si escribes $b = $a, esperas que se
comporte igual que si escribieses $b = 5. En otras palabras, $a es una expresion tambien con el valor 5. Si todo va bien, eso
es exactamente lo que pasara.
Las funciones son un ejemplo algo mas complejo de expresiones. Por ejemplo, considera la siguiente funcion:
function foo () {
return 5;
}

Suponiendo que estes familiarizado con el concepto de funciones (si no lo estas echale un vistazo al capitulo sobre
funciones), asumiras que teclear $c = foo() es esencialmente lo mismo que escribir $c = 5 y has acertado. Las
funciones son expresiones que valen el valor que retornan. Como foo() devuelve 5, el valor de la expresion ’foo()’ es 5.
Normalmente las funciones no devuelven un valor fijo, sino que suele ser calculado.
Desde luego, los valores en PHP no se limitan a enteros y lo mas normal es que no lo sean. PHP soporta tres tipos
escalares: enteros, punto flotante y cadenas (los tipos escalares son aquellos cuyos valores no pueden ’dividirse’ en partes
menores, no como los arrays, por ejemplo). PHP tambien soporta dos tipos compuestos (no escalares): arrays y objetos. Se
puede asignar cada uno de estos tipos de valor a variables o bien retornarse de funciones, sin ningun tipo de limitacion.
Hasta aqui, los usuarios de PHP/FI 2 no deberian haber notado ningun cambio. Sin embargo, PHP lleva las expresiones
mucho mas alla, al igual que otros lenguajes. PHP es un lenguaje orientado a expresiones, en el sentido de que casi todo es
una expresion. Considera el ejemplo anterior ’$a = 5’. Es sencillo ver que hay dos valores involucrados, el valor de la
constante entera ’5’ y el valor de $a que esta siendo actualizado tambien a 5. Pero la verdad es que hay un valor adicional
implicado aqui y es el valor de la propia asignacion. La asignacion misma se evalua al valor asignado, en este caso 5. En la
practica, quiere decir que ’$a = 5’, independientemente de lo que hace, es una expresion con el valor 5. De esta manera
escribir algo como ’$b = ($a = 5)’ es como escribir ’$a = 5; $b = 5;’ (un punto y coma marca el final de una instruccion).
Como las asignaciones se evaluan de derecha a izquierda, puedes escribir tambien ’$b = $a = 5’.
Otro buen ejemplo de orientacion a expresiones es el pre y post incremento y decremento. Los usuarios de PHP/FI 2 y los
de otros muchos lenguajes les sonara la notacion variable++ y variable–. Esto son las operaciones de incremento y
decremento. En PHP/FI 2, la instruccion ’$a++’ no tiene valor (no es una expresion) y no puedes asignarla o usarla de
ningun otro modo. PHP mejora las caracteristicas del incremento/decremento haciendolos tambien expresiones, como en
C. En PHP, como en C, hay dos tipos de incremento - pre-incremento y post-incremento. Ambos, en esencia, incrementan
la variable y el efecto en la variable es identico. La diferencia radica en el valor de la propia expresion incremento. El
preincremento , escrito ’++$variable’, se evalua al valor incrementado (PHP incrementa la variable antes de leer su valor
de ahi el nombre ’preincremento’). El postincremento, escrito ’$variable++’, se evalua al valor original de $variable antes
de realizar el incremento (PHP incrementa la variable despues de leer su valor, de ahi el nombre ’postincremento’).
Un tipo muy corriente de expresiones son las expresiones de comparacion. Estas expresiones se evaluan a 0 o 1
significando FALSO (FALSE) o CIERTO (TRUE), respectivamente. PHP soporta > (mayor que), >= (mayor o igual que)
== (igual que), != (distinto), < (menor que) y <= (menor o igual que). Estas expresiones se usan frecuentemente dentro de
la ejecucion condicional como la instruccion if.
El ultimo tipo de expresiones que trataremos, es la combinacion operador-asignacion. Si quieres incrementar
$a en 1, basta con escribir ’$a++’ o ++$a’. Pero que pasa si quieres añadir mas de 1, por ejemplo 3? Podrias escribir ’$a++’
multiples veces, pero no es una forma de hacerlo ni eficiente ni comoda. Una practica mucho mas corriente es escribir ’$a
= $a + 3’. ’$a + 3’ se evalua al valor de $a mas 3 y se asigna de nuevo a $a, lo que resulta en incrementar $a en 3. En PHP
como en otros lenguajes como C, puedes escribir esto de una forma mas concisa, que con el tiempo sera mas clara y
tambien facil de entender. Añadir 3 al valor actual de $a se puede escribir como ’$a += 3’. Esto quiere decir exactamente
"toma el valor de $a, sumale 3 y asignalo otra vez a $a". ademas de ser mas corto y claro, tambien resulta en una
ejecucion mas rapida. El valor de ’$a += 3’, como el valor de una asignacion normal y corriente, es el valor asignado. Ten
en cuenta que NO es 3, sino el valor combinado de $a mas 3 (ese es el valor asignado a $a). Cualquier operacion binaria
puede ser usada en forma de operador-asignacion, por ejemplo ’$a -= 5’ (restar 5 del valor de $a), ’$b *= 7’ (multiplicar el
valor de $b por 5), etc.
Hay otra expresion que puede parecer extraña si no la has visto en otros lenguaes, el operador condicional ternario:
$first ? $second: $third
Si el valor de la primera subexpresion es verdadero (distinto de cero), entonces se evalua la segunda subexpresion, si no, se
evalua la tercera y ese es el valor.
El siguiente ejemplo te ayudara a comprender un poco mejor el pre y post incremento y las expresiones en general:
function double($i) {
return $i*2;
}
$b = $a = 5; /* asignar el valor cinco a las variables $a y $b */
$c = $a++; /* postincremento, asignar el valor original de $a (5) a $c */
$e = $d = ++$b; /* preincremento, asignar el valor incrementado de $b (6) a
$d y a $e */
/* en este punto, tanto $d como $e son iguales a 6 */
$f = double($d++); /* asignar el doble del valor de $d antes
del incremento, 2*6 = 12 a $f */
$g = double(++$e); /* asignar el doble del valor de $e despues
del incremento, 2*7 = 14 a $g */
$h = $g += 10; /* primero, $g es incrementado en 10 y termina valiendo 24.
despues el valor de la asignacion (24) se asigna a $h
y $h tambien acaba valiendo 24. */

Al principio del capitulo hemos dicho que describiriamos los distintos tipos de instrucciones y, como prometimos, las
expresiones pueden ser instrucciones. Sin embargo, no todas las expresiones son instrucciones. En este caso, una
instruccion tiene la forma ’expr’ ’;’, es decir, una expresion seguida de un punto y coma. En ’$b=$a=5;’, $a=5 es una
expresion valida, pero no es una instruccion en si misma. Por otro lado ’$b=$a=5:’ si es una instruccion valida.
Una ultima cosa que vale la pena mencionar, es el valor booleano de las expresiones. En muchas ocasiones, principalmente
en condicionales y bucles, no estas interesado en el valor exacto de la expresion, sino unicamente si es CIERTA (TRUE) o
FALSA (FALSE) (PHP no tiene un tipo booleano especifico). El valor de verdad de las expresiones en PHP se calcula de
forma similar a perl. Cualquier valor numerico distinto de cero es CIERTO (TRUE), cero es FALSO (FALSE). Fijate en
que los valores negativos son distinto de cero y considerados CIERTO (TRUE)! La cadena vacia y la cadena "0"son
FALSO (FALSE); todas las demas cadenas son TRUE. Con los tipos no escalares (arrays y objetos) - si el valor no
contiene elementos se considera FALSO (FALSE), en caso contrario se considera CIERTO (TRUE).
PHP te brinda una completa y potente implementacion de expresiones y documentarla enteramente esta mas alla del
objetivo de ete manual. Los ejemplos anteriores, deberian darte una buena idea de que son las expresiones y como construir
expresiones utiles. A lo largo del resto del manual, escribiremos expr para indicar una expresion PHP valida.
Anterior: constantes en php
Siguiente: operadores en php