Las formas más básicas de expresiones son las constantes y las
variables. Cuando escribes "$a = 5", estás asignando ’5’
a
$a. ’5’, obviamente, tiene el valor 5 o, en otras palabras ’5’
es una expresión con el valor 5 (en este caso, ’5’ es una
constante entera).
Después de esta asignación, esperarás que el valor de $a
sea 5 también, de manera que si escribes $b = $a, esperas que se
comporte igual que si escribieses $b = 5. En otras palabras, $a es una expresión
también con el valor 5. Si todo va bien, eso
es exactamente lo que pasará.
Las funciones son un ejemplo algo más complejo de expresiones. Por ejemplo,
considera la siguiente función:
function foo () {
return 5;
}
Suponiendo que estés familiarizado con el concepto de funciones (si
no lo estás échale un vistazo al capítulo sobre
funciones), asumirás 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 expresión ’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 más 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 también 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 ningún tipo de limitación.
Hasta aquí, los usuarios de PHP/FI 2 no deberían haber notado
ningún cambio. Sin embargo, PHP lleva las expresiones
mucho más allá, al igual que otros lenguajes. PHP es un lenguaje
orientado a expresiones, en el sentido de que casi todo es
una expresión. 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 está siendo actualizado
también a 5. Pero la verdad es que hay un valor adicional
implicado aquí, y es el valor de la propia asignación. La asignación
misma se evalúa al valor asignado, en este caso 5. En la
práctica, quiere decir que ’$a = 5’, independientemente de
lo que hace, es una expresión 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 instrucción).
Como las asignaciones se evalúan de derecha a izquierda, puedes escribir
también ’$b = $a = 5’.
Otro buen ejemplo de orientación a expresiones es el pre y post incremento
y decremento. Los usuarios de PHP/FI 2 y los
de otros muchos lenguajes les sonará la notación variable++ y
variable–. Esto son las operaciones de incremento y
decremento. En PHP/FI 2, la instrucción ’$a++’ no tiene valor
(no es una expresión), y no puedes asignarla o usarla de
ningún otro modo. PHP mejora las características del incremento/decremento
haciéndolos también 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 idéntico. La diferencia radica
en el valor de la propia expresion incremento. El
preincremento , escrito ’++$variable’, se evalúa al valor
incrementado (PHP incrementa la variable antes de leer su valor,
de ahí el nombre ’preincremento’). El postincremento, escrito
’$variable++’, se evalúa al valor original de $variable antes
de realizar el incremento (PHP incrementa la variable después de leer
su valor, de ahí el nombre ’postincremento’).
Un tipo muy corriente de expresiones son las expresiones de comparación.
Estas expresiones se evalúan 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 ejecución condicional como la instrucción if.
El último tipo de expresiones que trataremos, es la combinación
operador-asignación. Si quieres incrementar
$a en 1, basta con escribir ’$a++’ o ++$a’. Pero qué
pasa si quieres añadir más de 1, por ejemplo 3? Podrías
escribir ’$a++’
múltiples veces, pero no es una forma de hacerlo ni eficiente ni cómoda.
Una práctica mucho más corriente es escribir ’$a
= $a + 3’. ’$a + 3’ se evalúa al valor de $a más
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 más
concisa, que con el tiempo será más clara y
también fácil 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, súmale 3, y asígnalo otra vez a $a".
Además de ser más corto y claro, también resulta en una
ejecución más rápida. El valor de ’$a += 3’,
como el valor de una asignación normal y corriente, es el valor asignado.
Ten
en cuenta que NO es 3, sino el valor combinado de $a más 3 (ése
es el valor asignado a $a). Cualquier operación binaria
puede ser usada en forma de operador-asignación, por ejemplo ’$a
-= 5’ (restar 5 del valor de $a), ’$b *= 7’ (multiplicar el
valor de $b por 5), etc.
Hay otra expresión 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 subexpresión es verdadero (distinto de cero),
entonces se evalúa la segunda subexpresión, si no, se
evalúa la tercera y ése es el valor.
El siguiente ejemplo te ayudará 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 después
del incremento, 2*7 = 14 a $g */
$h = $g += 10; /* primero, $g es incrementado en 10 y termina valiendo 24.
después el valor de la asignación (24) se asigna a $h,
y $h también acaba valiendo 24. */
Al principio del capítulo hemos dicho que describiríamos 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
instrucción tiene la forma ’expr’ ’;’, es decir,
una expresión seguida de un punto y coma. En ’$b=$a=5;’,
$a=5 es una
expresión válida, pero no es una instrucción en sí
misma. Por otro lado ’$b=$a=5:’ sí es una instrucción
válida.
Una última cosa que vale la pena mencionar, es el valor booleano de las
expresiones. En muchas ocasiones, principalmente
en condicionales y bucles, no estás interesado en el valor exacto de
la expresión, sino únicamente si es CIERTA (TRUE) o
FALSA (FALSE) (PHP no tiene un tipo booleano específico). El valor de
verdad de las expresiones en PHP se calcula de
forma similar a perl. Cualquier valor numérico distinto de cero es CIERTO
(TRUE), cero es FALSO (FALSE). Fíjate en
que los valores negativos son distinto de cero y considerados CIERTO (TRUE)!
La cadena vacía y la cadena "0"son
FALSO (FALSE); todas las demás 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 implementación de expresiones, y
documentarla enteramente está más allá del
objetivo de ete manual. Los ejemplos anteriores, deberían darte una buena
idea de qué son las expresiones y cómo construir
expresiones útiles. A lo largo del resto del manual, escribiremos expr
para indicar una expresión PHP válida.
|
Anterior: constantes en php |
Siguiente: operadores en php |
| articulos relacionados |