Las estructuras de control nos permiten controlar el flujo del programa: tomar decisiones, realizar acciones repetitivas etc, dependiendo de unas condiciones que nosotros mismos establezcamos.
La estructura de control IF permite decidir entre dos opciones resultantes de la evaluación de una sentencia. Si la evaluación es positiva hace una cosa, también podemos especificar acciones para realizar en caso de que la evaluación sea negativa.
La sentencia switch es similar a una serie de sentencias IF en la misma expresión. En muchas ocasiones, es posible que se quiera comparar la misma variable (o expresión) con muchos valores diferentes, y ejecutar una parte de código distinta dependiendo de a que valor es igual. Para esto es exactamente la expresión switch.
Estructuras Repetitivas
WHILE
(PHP 4, PHP 5)
Los bucles while son el tipo más sencillo de bucle en PHP. Se comportan igual que su contrapartida en C. La forma básica de una sentencia while es:
while (expr)
sentencia
El significado de una sentencia while es simple. Le dice a PHP que ejecute las sentencias anidadas, tanto como la expresión while se evalúe como
TRUE
. El valor de la expresión es verificado cada vez al inicio del bucle, por lo que incluso si este valor cambia durante la ejecución de las sentencias anidadas, la ejecución no se detendrá hasta el final de la iteración (cada vez que PHP ejecuta las sentencias contenidas en el bucle es una iteración). A veces, si la expresión while se evalúa como FALSE
desde el principio, las sentencias anidadas no se ejecutarán ni siquiera una vez.
Al igual que con la sentencia if, se pueden agrupar varias instrucciones dentro del mismo bucle while rodeando un grupo de sentencias con corchetes, o utilizando la sintaxis alternativa:
while (expr):
sentencias
...
endwhile;
Los siguientes ejemplos son idénticos y ambos presentan los números del 1 al 10:
<?php
$i = 1;
while ($i <= 10) {
echo $i++; /* el valor presentado sería
$i antes del incremento
(post-incremento) */
}
/* ejemplo 2 */
$i = 1;
while ($i <= 10):
echo $i;
$i++;
endwhile;
?>
FOR
(PHP 4, PHP 5)
Los bucles for son los ciclos más complejos en PHP. Se comportan como sus contrapartes en C. La sintaxis de un bucle for es:
for (expr1; expr2; expr3)
sentencia
La primera expresión (expr1) es evaluada (ejecutada) una vez incondicionalmente al comienzo del bucle.
En el comienzo de cada iteración, la expr2 es evaluada, Si es
TRUE
, el bucle continúa y las sentencias anidadas son ejecutadas. Si se evalúa como FALSE
, termina la ejecución del bucle.
Al final de cada iteración, la expr3 es evaluada (ejecutada).
Cada una de las expresiones puede estar vacía o contener múltiples expresiones separadas por comas. En la expr2, todas las expresiones separadas por una coma son evaluadas pero el resultado se toma de la última parte. Que la expr2 esté vacía significa que el bucle deberá ser corrido indefinidamente (PHP implícitamente lo considera como
TRUE
, como en C). Esto puede no ser tan inútil como se pudiera pensar, ya que muchas veces se quiere terminar el bucle usando una sentencia condicional break en lugar de utilizar la expresión verdadera del for.
Considere los siguientes ejemplos. Todos ellos muestran los números del 1 al 10:
<?php
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
/* ejemplo 2 */
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}
$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>
Por supuesto, el primer ejemplo parece ser el mejor (o quizás el cuarto), pero se puede encontrar que la posibilidad de usar expresiones vacías en los bucles for resulta útil en muchas ocasiones.
PHP también soporta la sintaxis alternativa de los dos puntos para bucles for.
for (expr1; expr2; expr3):
sentencia
...
endfor;
Es una cosa común a muchos usuarios iterar por medio de arrays como en el ejemplo de abajo.
<?php
/*
* Este es un array con algunos datos que se desean modificar
* cuando se corra por el bucle for.
*/
$people = Array(
Array('name' => 'Kalle', 'salt' => 856412),
Array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0; $i < sizeof($people); ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
?>
El problema radica en la segunda expresión del for. Este código puede ser lento porque tiene que calcular el tamaño del array en cada iteración. Dado que el tamaño nunca cambia, se pueden optimizar fácilmente usando una variable intermedia para almacenar el tamaño y usarla en el bucle en lugar del sizeof. El siguiente ejemplo ilustra esto:
<?php
$people = Array(
Array('name' => 'Kalle', 'salt' => 856412),
Array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0, $size = sizeof($people); $i < $size; ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
?>
DO-WHILE
(PHP 4, PHP 5)
Los bucles do-while son muy similares a los bucles while, excepto que la expresión verdadera es verificada al final de cada iteración en lugar que al principio. La diferencia principal con los bucles while es que está garantizado que corra la primera iteración de un bucle do-while (la expresión verdadera sólo es verificada al final de la iteración), mientras que no necesariamente va a correr con un bucle while regular (la expresión verdadera es verificada al principio de cada iteración, si se evalúa como FALSE justo desde el comienzo, la ejecución del bucle terminaría inmediatamente).
Hay una sola sintaxis para bucles do-while:
<?php
$i = 0;
do {
echo $i;
} while ($i > 0);
?>
El bucle de arriba se ejecutaría exactamente una sola vez, ya que después de la primera iteración, cuando la expresión verdadera es verificada, se evalúa como FALSE ($i no es mayor que 0) y termina la ejecución del bucle.
Los usuarios avanzados de C pueden estar familiarizados con un uso distinto del bucle do-while, para permitir parar la ejecución en medio de los bloques de código, mediante el encapsulado con do-while (0), y utilizando la sentencia break. El siguiente fragmento de código demuestra esto:
<?php
do {
if ($i < 5) {
echo "i no es lo suficientemente grande";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
echo "i está bien";
/* procesar i */
} while (0);
?>
No se preocupe si no se entiende esto completamente o en absoluto. Se pueden codificar scripts e incluso scripts potentes sin usar esta 'característica'. Desde PHP 5.3.0, es posible utilizar el operador GOTO en lugar de este hack.
FOREACH
(PHP 4, PHP 5)
El constructor foreach proporcina un modo sencillo de iterar sobre arrays. foreach funciona sólo sobre arrays y objetos, y emitirá un error al intentar usarlo con una variable de un tipo diferente de datos o una variable no inicializada. Existen dos sintaxis:
foreach (expresión_array as $valor) sentencias foreach (expresión_array as $clave => $valor) sentencias
La primera forma recorre el array dado por expresión_array. En cada iteración, el valor del elemento actual se asigna a $valor y el puntero interno del array avanza una posición (así en la próxima iteración se estará observando el siguiente elemento).
La segunda forma además asigna la clave del elemento actual a la variable $clave en cada iteración.
También es posible personalizar la interacion de objetos.
Nota:
Cuando foreach inicia su ejecución, el puntero interno del array se pone automáticamente en el primer elemento del array. Esto significa que no es necesario llamar la función reset() antes de un bucle foreach.
Ya que foreach depende el puntero de array interno, cambiar éste dentro del bucle puede conducir a un comportamiento inesperado.
Para poder modificar directamente los elementos del array dentro de bucle, se ha de anteponer & a $valor. En este caso el valor será asignado por referencia.
<?php
$array = array(1, 2, 3, 4);
foreach ($array as &$valor) {
$valor = $valor * 2;
}
// $array ahora es array(2, 4, 6, 8)
unset($valor); // rompe la referencia con el último elemento
?>
Referenciar $valor sólo es posible si el array iterado puede ser referenciado (es decir, si es una variable). El siguiente código no funcionará: <?php
foreach (array(1, 2, 3, 4) as &$valor) {
$valor = $valor * 2;
}
Funciones y Procedimientos PHP
Al igual que en otros lenguajes estructurados, PHP nos permite crear nuestras propias funciones e incluso crear nuestras propias librerías de funciones de manera simple y práctica.
El concepto de función en PHP es el mismo que en otros lenguajes de programación, un conjunto de instrucciones que modifican o crean ciertas variables para realizar una tarea más o menos elemental, recordando que las funciones siempre devuelven un valor y en el caso de PHP ese valor puede ser de cualquiera de los tipos ya estudiados.
En el caso de los procedimientos, PHP no dispone de ninguna instrucción para crear procedimientos, simplemente lo trataremos como una función que no devuelve ningún valor sino que se limita a ejecutar un grupo de instrucciones.
Conviene recordar que también existen una gran cantidad de funciones integradas en PHP, las cuales son muy fáciles de utilizar. Tan sólo hemos de realizar la llamada de la forma apropiada y especificar los parámetros y/o variables necesarios para que la función realice su tarea. Cuando necesitemos crear una tarea que sea repetitiva o común es conveniente revisar o investigar si no existe una función integrada de PHP que ya realice tal tarea.
Sintaxis de una función
function nombre_funcion(parametro1, parametro2,... parametroN)
{
Instruccion 1;
Instruccion 2;
Instruccion 3;
...
Instruccion N;
return valor;
}
Como se puede ver, para declarar la función se usa la palabra reservada function, seguidamente el nombre de la función y la lista de parámetros entre paréntesis. Dentro del bloque de instrucciones agrupadas debe existir la instrucción return, la cual se encarga de devolver el valor deseado al punto del programa que invoco la función
Ejemplo de función
<html>
<head> <title>Ejemplo de funcion</title>
</head>
<body>
<?php
function escribe_separa($cadena){
for ($i=0;$i<strlen($cadena);$i++){
echo $cadena[$i];
if ($i<strlen($cadena)-1)
echo "-";
}
}
escribe_separa ("hola");
echo "<p>";
escribe_separa ("Texto más largo, a ver lo que hace");
?>
</body>
</html>
En el ejemplo anterior se crea una función escribe_separa que toma una cadena de caracteres y la reescribe intercalando guones (-), por ejemplo si el parámetro de la función es "hola", devuelve "h-o-l-a".
Para lograrlo se usa la función srtlen(), la cual devuelve el numero de caracteres que componen una cadena.
Paso de parámetros. Características
Los parámetros son los datos que reciben las funciones y que utilizan para realizar las operaciones de la función. Una función puede recibir cualquier número de parámetros, incluso ninguno.
function f1 ($parametro1, $parámetro2
Así definimos una función llamada f1 que recibe dos parámetros. Como se puede observar, no se tiene que definir el tipo de datos de cada parámetro.
Los parámetros tienen validez durante la ejecución de la función, es decir, tienen un ámbito local a la función donde se están recibiendo. Cuando la función se termina, los parámetros dejan de existir.
Cuando los parámetros se pasan por valor
El paso de parámetros en PHP se realiza por valor. "Por valor" es una manera típica de pasar parámetros en funciones, quiere decir que el cambio de un dato de un parámetro no actualiza el dato de la variable que se pasó a la función. Por ejemplo, cuando invocamos una función pasando una variable como parámetro, a pesar de que cambiemos el valor del parámetro dentro de la función, la variable original no se ve afectada por ese cambio. Puede que se vea mejor con un ejemplo:
function porvalor ($parametro1){
$parametro1="hola";
echo "<br>" . $parametro1; //imprime "hola"
}
$mivariable = "esto no cambia";
porvalor ($mivariable);
echo "<br>" . $mivariable; //imprime "esto no cambia"
Esta página tendrá como resultado:
hola
esto no cambia
esto no cambia
Cuando los parámetros se pasan por referencia
En contraposición al paso de parámetros por valor, está el paso de parámetros por referencia. En este último caso, el cambio del valor de un parámetro dentro de una función sí afecta al valor de la variable original.
Podemos pasar los parámetros por referencia si, en la declaración de la función, colocamos un "&" antes del parámetro.
function porreferencia(&$cadena)
{
$cadena = 'Si cambia';
}
$str = 'Esto es una cadena';
porreferencia ($str);
echo $str; // Imprime 'Si cambia'
Este script mostrará por pantalla 'Si cambia'.
Por ultimo. Parámetros por defecto
Podemos definir valores por defecto para los parámetros. Los valores por defecto sirven para que los parámetros contengan un dato predefinido, con el que se inicializarán si no se le pasa ningún valor en la llamada de la función. Los valores por defecto se definen asignando un dato al parámetro al declararlo en la función.
function pordefecto ($parametro1="pepe";$parametro2=3)
Para la definición de función anterior, $parametro1 tiene como valor por defecto "pepe", mientras que $parametro2 tiene 3 como valor por defecto.
Si llamamos a la función sin indicar valores a los parámetros, estos tomarán los valores asignados por defecto:
pordefecto () // $parametro1 vale "pepe" y $parametro2 vale 3
Si llamamos a la función indicando un valor, este será tenido en cuenta para el primer parámetro.
pordefecto ("hola") // $parametro1 vale "hola" y $parametro2 vale 3
Atención, estamos obligados a declarar todos los parámetros con valores por defecto al final.
Ejemplos
Procedimiento que toma una palabra y la vuelve a escribir con guiones intercalados
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Función para cadenas de texto</title>
</head>
<body>
<?php
function escribe_separa($cadena){
for($i=0;$i<strlen($cadena);$i++){
echo $cadena[$i];
if ($i<strlen($cadena)-1){
echo "-";
}
}
}
escribe_separa("hola");
echo "<br />";
escribe_separa("Texto mas largo, a ver lo que hace");
?>
</body>
</html>
Función que genera una clave aleatoria
<?php
function generaClave(){
$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
$cad = "";
for($i=0;$i<8;$i++) {
$cad .= substr($str,rand(0,62),1);
}
return $cad;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Generar Clave PHP</title>
</head>
<body>
<h2>Generar Clave aleatoria</h2>
<?php
$claveNueva = generaClave();
echo "Clave generada: <strong>$claveNueva</strong>";
?>
</body>
</html>
CONCEPTOS BÁSICOS DE PHP
Un archivo PHP normalmente suele contener HTML y trozos de código PHP. Por ello antes de estudiar PHP es necesario haber estudiado HTML. A veces, se dice que PHP es un lenguaje “embebido” en HTML, es decir, incrustado en código HTML. Todos los fragmentos de código PHP deben comenzar con la siguiente cadena de caracteres: <?php ,y finalizar con ?>
Los símbolos <?php y ?> se dice que son los delimitadores del código PHP. Normalmente, una página PHP básica sería algo así:
<!DOCTYPE html>
<html>
<head>
<title>Ejemplo de una web con PHP - aprenderaprogramar.com</title>
<meta charset="utf-8">
</head>
<body>
<?php
/* Aquí vendría el código PHP */
/* Este código PHP podría ser una consulta a base de datos */
/* Y además podríamos mostrar esos datos */
?>
</body>
</html>
|
En este código podemos identificar los siguientes elementos:
- La primera línea es una etiqueta relativa a la versión/variante de HTML que declaramos usar. Esta primera etiqueta no es estrictamente necesaria. Sirve únicamente para indicar qué estándar de HTML es el que declaramos usar.
- Las etiquetas de apertura y cierre de html que delimitan el código HTML.
- Las etiquetas de apertura y cierre head que delimitan la cabecera del código HTML.
- Las etiquetas body que delimitan el cuerpo del código HTML y que es donde suele ir el contenido central de un documento HTML (texto, imágenes, formularios, etc.).
- Dentro de las etiquetas body, además de código HTML, podemos tener código PHP embebido. En este caso hemos incluido únicamente un fragmento de código PHP, pero en el cuerpo del documento HTML podríamos incluir diversos fragmentos de código HTML mezclados con diversos fragmentos de código PHP. Cada fragmento de código PHP tiene que ir escrito con sus delimitadores.
Esta estructura no se repite siempre. De hecho, más adelante veremos que el código PHP puede ir en más lugares además de dentro de las etiquetas body. Por otro lado, decir que es habitual que el código PHP vaya embebido dentro de código HTML en un archivo con extensión .php, pero como ya hemos visto, un archivo con extensión .php podría contener exclusivamente código PHP.
Escribe el código que mostramos a continuación en el editor Notepad++ y guárdalo con el nombre prueba1.php.
<!DOCTYPE html>
<html>
<head>
<title>Ejemplo de una web con PHP - aprenderaprogramar.com</title>
<meta charset="utf-8">
</head>
<body>
<?php
echo "Mi primera página con PHP embebido en HTML - aprenderaprogramar.com";
?>
</body>
</html>
|
A continuación súbelo al servidor como ya explicamos en una entrega anterior, y ahora escribe en tu navegador la dirección web correspondiente al archivo (que será similar a http://apr2.byethost7.com/prueba1.php). Debes de visualizar algo parecido a esto.
Existen dos métodos con los que el navegador puede enviar información al servidor:
- Método HTTP GET. Información se envía de forma visible
- Método HTTP POST. Información se envía de forma no visible
Antes de que el navegador envíe la información proporcionada, la codifica mediante URL encoding, dando como resultado un Query String. Esta codificación es un esquema de keys y values separados por un ampersand &:
key1=value1&key2=value2&key3=value3...
Los espacios y otros caracteres no alfanuméricos se sustituyen. Una vez que la información es codificada, se envía al servidor.
Método HTTP GET
El método GET envía la información codificada del usuario en el header del HTTP request, directamente en la URL. La página web y la información codificada se separan por un interrogante ?:
www.ejemplo.com/index.htm?key1=value1&key2=value2&key3=value3...
- El método GET envía la información en la propia URL, estando limitada a 2000 caracteres.
- La información es visible por lo que con este método nunca se envía información sensible.
- No se pueden enviar datos binarios (archivos, imágenes...).
- En PHP los datos se administran con el array asociativo $_GET.
Ejemplo sencillo de formulario html con el método GET:
<html>
<body>
<form action="formget.php" method="get">
Nombre: <input type="text" name="nombre"><br>
Email: <input type="text" name="email"><br>
<input type="submit" value="Enviar">
</form>
Hola <?php isset($_GET["nombre"]) ? print $_GET["nombre"] : ""; ?><br>
Tu email es: <?php isset($_GET["email"]) ? print $_GET["email"] : ""; ?>
</body>
</html>
La url que resulta de hacer click en submit es de la forma:
formget.php?nombre=peter&email=peter%40ejemplo.com
En este caso @ es un carácter especial y se codifica.
Método HTTP POST
Con el método HTTP POST también se codifica la información, pero ésta se envía a través del body del HTTP Request, por lo que no aparece en la URL.
- El método POST no tiene límite de cantidad de información a enviar.
- La información proporcionada no es visible, por lo que se puede enviar información sensible.
- Se puede usar para enviar texto normal así como datos binarios (archivos, imágenes...).
- PHP proporciona el array asociativo $_POST para acceder a la información enviada.
<html>
<body>
<form action="formpost.php" method="post">
Nombre: <input type="text" name="nombre"><br>
Email: <input type="text" name="email"><br>
<input type="submit" value="Enviar">
</form>
Hola <?php isset($_POST["nombre"]) ? print $_POST["nombre"] : ""; ?><br>
Tu email es: <?php isset($_POST["email"]) ? print $_POST["email"] : ""; ?>
</body>
</html>
Se puede comprobar que la información no se muestra en la url.
Referencias:
https://desarrolloweb.com/articulos/estructura-if.html
https://manuales.guebs.com/php/control-structures.switch.html
http://cooolerphp.blogspot.com/2012/05/estructuras-repetitivas.html
http://jdcadenas.webcindario.com/cursophp/sitio/funciones.html
https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=540:conceptos-basicos-php-estructura-basica-pagina-etiquetas-apertura-y-cierre-embeber-en-html-cu00815b&catid=70&Itemid=193
https://diego.com.es/get-y-post-en-php