Capítulo 10. Expresiones

Las expresiones son la piedra angular de PHP . En PHP , casi cualquier cosa que escribes es una expresión . La forma más simple y ajustada de definir una expresión es " cualquier cosa que tiene un valor " .

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 :






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 . Ya sabes que 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 :




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 misma . Por otro lado ' $b=$a=5 : ' 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 .