Curso de PHP: Nivel Básico – Clase 4. Estructuras condicionales

En esta nueva entrega del curso básico de PHP de El Replicante vamos a estudiar las estructuras de control de flujo condicionales, también conocidas como estructuras selectivas o sentencias condicionales. Hasta aquí, los ejemplos que hemos estado haciendo en PHP eran todos lineales, comenzaban en la primera línea de código, luego ejecutaban la siguiente y así sucesivamente hasta llegar a la última. Ninguna era salteada, por ende, el curso del programa era totalmente predecible.

Ahora, presentaré estas estructuras condicionales que permiten al programa elegir qué código ejecutar según el estado de una o más variables. Primero veremos la estructura if… else; luego, el operador ternario ? que permite hacer lo mismo; y finalmente la estructura switch.

If… else

Comencemos observando la forma genérica que se usa. Para ello, utilizaré pseudocódigo, que es una forma más amigable de entender el algoritmo sin utilizar las palabras claves del lenguaje.

La estructura nos dice que: si se cumple la condición que aparece entre paréntesis, entonces se ejecuta el primer código encerrado entre llaves. Y si no se cumple la condición, entonces se ejecuta el segundo código encerrado entre llaves. Es importante destacar que la parte del si no es opcional, no es obligatorio incluirlo. En ese caso solo tendríamos:

La condición es una expresión donde podemos aprovechar algunos de los operadores que vimos en la clase 2. PHP evaluará la expresión que solo podrá devolver dos valores posibles: verdadero o falso. Si es verdadero, entonces se ejecutará la primera porción de código y si es falso, la segunda.

Ahora dejemos el pseudocódigo de lado y avancemos con un ejemplo verdadero en PHP:

$dinero = 320;

Como ven, la estructura original usa las palabras inglesas if (si) y else (si no). Primero definimos una variable y le asignamos el número entero 320. Luego, hacemos un if donde se evalúa si la variable $dinero es igual a 300. Noten que se ponen dos signos = para realizar la comparación. Esto es para distinguirlo de la asignación que solo requiere uno. Como la comparación será falsa, ya que en la variable hay 320 y no 300, se ejecutará la segunda porción de código entre llaves. Es decir que se imprimirá por pantalla la frase No tengo 300 pesos.

Observen que el else responde a la rigurosidad de la negación lógica. En este caso, no importa si el número es mayor o menor que 300, lo importantes es que NO es igual.

Si $dinero hubiera tenido el valor 300, entonces hubiéramos visto en pantalla el mensaje Tengo 300 pesos.

Expresiones más complejas

Si hasta aquí se entendió, llegó el momento de hacer un poco más complejo el asunto. La forma de lograrlo es construyendo condiciones más extensas y complicadas. Primero, vamos a presentar algunos operadores de comparación que son ideales para utilizarlos en los if.

  1. == Es el que conocimos recién. Se lo denomina comparador de equivalencia. Puede comparar tipos de datos distintos realizando una conversión, por eso, a veces es conveniente utilizar el siguiente operador.
  2. === 3 iguales seguidos es un comparador de identidad. Es más específico que el anterior. Devuelve true si los datos a comparar son del mismo tipo y tienen el mismo valor.
  3. != un signo de admiración seguido de un igual es el operador de no equivalencia. Opuesto al primero. En algunos otros lenguajes se utiliza el operador <> para cumplir la misma función.
  4. !=== Al igual que el segundo, este tiene en cuenta el tipo de dato. Devuelve true si los datos a comparar no son del mismo tipo o no tienen el mismo valor.

Con estos operadores y los que ya habíamos visto, podemos construir expresiones más complejas para nuestros if, veamos algunos ejemplos.

En este ejemplo, tenemos dos variables con valores asignados y una expresión más compleja que las anteriores. Como ven, tiene dos términos separados por el operador && que si recuerdan es el AND. El primer término compara si la variable $ahorro tiene un valor mayor o igual que 350. Como esto es así (es igual), se cumple. El segundo término, compara si $ingreso es menor que 650. Como esto también es así, entonces ambos términos son verdaderos. Luego, se hace AND entre ambos y como ya sabrán, el resultado es verdadero. Por lo tanto, luego se ejecutará la instrucción echo ‘Guardar el ahorro’.

Veamos otro ejemplo

En este código, usamos el operador || que es el OR lógico y noten que no hay else. Cualquiera de los tres términos que devuelva true hará que se ejecute la siguiente instrucción. Otro detalle a notar es que no hay llaves. Se pueden omitir cuando tanto el if o el else deben ejecutar una única instrucción.

Como imaginarán, pueden construirse expresiones de la complejidad que sea necesario. Pueden combinarse los operadores de la forma que sea necesaria, agrupar términos y utilizar funciones que devuelven verdadero o falso dentro. Es recomendable añadir paréntesis para que la expresión sea más legible.

Elseif

Esta estructura de control, hasta acá, puede condicionar el programa a dos caminos posibles. Es decir, es como un camino que se abre en dos. Ahora veremos como abrir ese camino en más rutas.

La manera de lograr esto es anidar los if, o poner uno a continuación del otro utilizando la palabra clave elseif.

Analicemos ahora el código. Empieza con un if clásico, pero el else tiene otro if pegado. Esto hará que si no se cumple la primera condición, se evalúe la del elseif. Podrían ponerse innumerables elseif; cada uno abriría una nueva posibilidad. Si no ocurren ninguna de las condiciones especificadas, entonces el código que se ejecuta es el del último else.

En este ejemplo puntual, tenemos dos variables: la cantidad de goles del Equipo A ($goles_a) y los del Equipo B ($goles_b). Si los goles del equipo A son mayores que el del B, entonces gana el A. Si no, si los goles del A son iguales a los del B, entonces hay empate. Si no, no quedan más posibilidades: gana el B. A partir de una condición hay tres caminos posibles para seguir.

Operador ternario ?

El operador ternario es otra forma de armar estructuras condicionales simples. Por ejemplo, a veces tenemos casos como este:

Como ven hay cuatro líneas de código para hacer una asignación condicional. Vamos a ver cómo hacer esto mismo con el operador ternario ?

¿Confuso? Expliquémoslo entonces. El operador ternario funciona así: primero la variable a la que se quiere asignar más el operador de asignación (=). Después se pone la condición, seguida del operador ?. A continuación, el valor si la asignación es verdadera seguida de dos puntos (:) más el valor si la asignación es falsa.

Para verlo de forma simple, podemos interpretar el código mirando el operador como si fuera un signo de pregunta. “¿Se cumple la condición?” Si es así, se usa el primer valor que viene a continuación y si no es así, el segundo.

Proveniendo de tecnologías como C y Java en el ámbito académico, el operador ternario ? fue siempre algo que me molestó bastante y que me parecía ajeno. Pero como todo tiene un por qué de su existencia. Utilizándolo, el código se hace mucho más corto y es también más fácil de leer. Aunque para algunos, puede resultar complicado al principio si están acostumbrados a otros lenguajes.

Switch

La sentencia switch equivale a poner muchos if uno debajo del otro, pero con la ventaja de hacer más prolijo el código. Veamos como se usa:

El funcionamiento es muy simple. Se pone switch y una variable entre paréntesis. Luego, por cada valor de la variable que nos interese hacer algo ponemos un case más el valor (pueden ser strings). A continuación ponemos dos puntos y el código que queremos que se ejecute para ese caso. Finalmente, se pone un break, lo que obliga a interrumpir la sentencia switch y a seguir el flujo del programa sin que se ingrese a los otros case.

Si no se da ningún caso, se puede poner al final la opción default que se ejecutará si no se dio ninguno de los casos especificados.

El break es opcional y si bien a veces es raro no incluirlos, hay otras donde intencionalmente se omiten porque se busca que se ejecute un case y también otros. Veamos un ejemplo de esto:

Imaginen que están programando un videojuego que se controla con el teclado y supongan que se puede usar tanto el numércio como el alfabético. Por ejemplo, para mover hacia arriba se puede presionar ‘w’ o el ‘8’. Necesitarán una estructura similar a la de este ejemplo. Noten que se ponen dos case juntos y que el primero no lleva break. De esta forma no hay que repetir el código asociado al case.

Un tip importante que me quedó grabado del primer año de la universidad es que conviene utilizar el switch únicamente cuando el código que debe ejecutarse en el case es de una única instrucción. Eso es lo que decía mi profesor y que según él era una buena práctica de programación. Durante mucho tiempo respeté esa norma y por eso, personalmente, cuando el código del case excede la línea, lo convierto en un if, aunque es verdad que he visto códigos de decenas de líneas dentro de un case.

Sintaxis alternativa

Existe otra sintaxis para hacer sentencias selectivas. Es otra forma de escribir las estructuras y se hace muy útil cuando se trabaja con PHP y HTML en el mismo documento. Veamos un ejemplo

Observemos los cambios. No se usan llaves para abrir, sino que se utilizan los dos puntos y con eso alcanza para poner todas las instrucciones que se necesiten debajo. En lugar de llave de cierre, se utiliza endif;

Hasta aquí hemos visto todas las formas de cambiar el rumbo de un programa haciendo que una parte se ejecute y otra se omita. En la próxima clase veremos como repetir partes del código cuando veamos las sentencias iterativas.

Ejercicios propuestos

  1. Definir un array de 5 elementos y asignar a cada uno de ellos un número. Mediante una estructura condicional, determinar si el promedio de los números son mayores o menores que 6. Mostrar un mensaje por pantalla informando el resultado.
  2. Dadas tres variables numéricas de tipo entero $a, $b y $c realizar un programa en PHP que determine cuál tiene el mayor valor y cuál el menor.
  3. Realizar un programa que en base al valor numérico de una variable $num, pueda mostrarse por pantalla, el nombre del número que tenga dentro escrito con palabras, para los números entre el 20 y el 60. Por ejemplo, si $num = 43 debe mostrarse por pantalla “cuarenta y tres”.
  4. Escribir un programa que use una variable $operador que puede almacenar los símbolos matemáticos: ‘+’, ‘-‘,’/’ y ‘x’; y definir dos variables enteras $op1 y $op2. De acuerdo al símbolo que tenga la variable $operador, deberá realizarse la operación indicada y mostrarse el resultado por pantalla.
  5. Realizar un programa que en base al valor numérico de una variable que puede estar entre 1 y 7, se imprima por pantalla el día de la semana asociado. Por ejemplo 1 –> Domingo, 2 –> Lunes… etc.

Bibliografía

  • Zend PHP5 Certification Study Guide de Davey Shafik con Ben Ramsey, php architect nanobooks
  • Estructuras de Datos Estáticas en Pascal, de Zulma Cataldi y Fernando J. Lage. Centro de Estudiantes de Ingeniería.
Soy programador web y me desempeño como Líder Técnico y de Proyectos en Polar Bear Development. Trabajo con tecnologías como PHP, Javascript, MySQL y HTML5 para el desarrollo de sitios y sistemas web. Me especializo en Zend Framework 2 y otros frameworks MVC, como también en WordPress y otros CMS. Lidero equipos de desarrolladores trabajando con Scrum. Vivo en Buenos Aires, Argentina.
 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*