D.G.I.T.

Instituto Tecnológico de Celaya :: © 2005 Todos los derechos reservados

PHP Básico


PHP, acrónimo de " Hypertext Preprocessor ", es un lenguaje interpretado de alto nivel incrustado en páginas HTML. La mayoría de su sintaxis es similar a C, Java y Perl. La meta de este lenguaje es permitir escribir a los creadores de páginas web, páginas dinámicas de una manera rápida y fácil.

Ejemplo. Una página básica

<html>
<head>
<title>Ejemplo PHP</title>
</head>
<body>
     <?php echo "Este es un ejemplo con PHP!"; ?>
</body>
</html>

Usar PHP implica no tener que escribir un programa con muchos comandos para crear una salida en HTML, sino escribir el código HTML con cierta parte de código en PHP incrustado en el mismo archivo que producirá la salida. El código PHP se incluye entre etiquetas especiales de comienzo y final <?php .... ?> que nos permiten entrar y salir del modo PHP.

Lo que distingue a PHP de la tecnología JavaScript, la cual se ejecuta en la máquina cliente, es que el código PHP es ejecutado en el servidor. Si tuviésemos un script similar al del ejemplo en nuestro servidor, el cliente solamente recibiría el resultado de su ejecución en dicho servidor, sin ninguna posibilidad de determinar que código generó el resultado recibido. Un servidor con estas características es configurado para que procese todos los archivos HTML que contengan scripts en PHP.


Aplicación de PHP

Al nivel más básico, PHP puede procesar información recibida de los formularios, generar páginas con contenidos dinámicos o mandar y recibir cookies.

Tal vez la característica más potente y destacable de PHP es su soporte para una gran cantidad de bases de datos. Escribir una interfaz vía web para una base de datos es una tarea simple con PHP. Las siguientes bases de datos están soportadas actualmente :

Adabas D

Ingres

Oracle (OCI7 and OCI8)

dBase

InterBase

PostgreSQL

Empress

FrontBase

Solid

FilePro

mSQL

Sybase

IBM DB2

MySQL

Velocis

Informix

ODBC

Unix dbm



Historia de PHP

PHP fue concebido en otoño de 1994 por Rasmus Lerdof. Las primeras versiones no distribuidas al público fueron usadas en un sus páginas web para mantener un control sobre quien consultaba su currículum. La primera versión disponible para el público a principios de 1995 fue conocida como "Herramientas para paginas web personales" ( Personal Home Page Tools ). Consistían en un analizador sintáctico muy simple que solo entendía unas cuantas macros y una serie de utilerías comunes en las páginas web de entonces; un libro de visitas, un contador y otras pequeñas cosas. El analizador sintáctico fue reescrito a mediados de 1995 y fue nombrado PHP/FI version 2. FI viene de otro programa que Rasmus había escrito y que procesaba los datos de formularios. Así que combinó las "Herramientas para paginas web personales", el "intérprete de formularios", añadió soporte para mSQL y PHP/FI vio la luz. PHP/FI creció a gran velocidad y la gente empezó a contribuir en el código.

Es difícil dar estadísticas exactas, pero se estima que a finales de 1996 PHP/FI se estaba usando al menos en 15.000 páginas web alrededor del mundo. A mediados de 1997 este número había crecido a mas de 50.000. A mediados de 1997 el desarrollo del proyecto sufrió un profundo cambio, dejó de ser un proyecto personal de Rasmus, al cual habían ayudado un grupo de usuarios y se convirtió en un proyecto de grupo mucho más organizado. El analizador sintáctico se rescribió desde el principio por Zeev Suraski y Andi Gutmans y este nuevo analizador estableció las bases para PHP versión 3.0. Gran cantidad de código de PHP/FI fue portado a PHP3 y otra gran cantidad fue escrito completamente nuevo.

Hoy en día, tanto PHP/FI, PHP3 como PHP4 se distribuyen en un gran número de productos tales como el servidor web "C2's StrongHold" y Redhat Linux. Una estimación conservativa basada en estadísticas de NetCraft ( vea también Estudio de NetCraft sobre servidores web ), es que más de 1.000.000 de servidores alrededor del mundo usan PHP. Para hacernos una idea, este número es mayor que el número de servidores que utilizan el "Netscape's Enterprise server" en Internet.

A la vez que todo esto está pasando, el trabajo de desarrollo de la próxima generación de PHP está en marcha. Esta versión utiliza el potente motor de scripts Zend para proporcionar altas prestaciones, así como soporta otros servidores web, además de Apache, que corren PHP como módulo nativo.

El código fuente y las distribuciones binarias para algunas plataformas ( incluído Windows) se pueden encontrar en http://www.php.net/.


Elementos de Programación de PHP

Las instrucciones se separan igual que en C o perl - terminando cada sentencia con un punto y coma ( ; ). La etiqueta de cierre ( ?> ) también implica el fin de la sentencia, así lo siguiente es equivalente:

<?php
    echo "Esto es una prueba";
?>

<?php echo "Esto es una prueba" ?>


Tipos de datos

PHP soporta los siguientes tipos :

El tipo de una variable normalmente no lo indica el programador; en su lugar, lo decide PHP en tiempo de ejecución dependiendo del contexto en el que se utilice esa variable.

Si se quisiese obligar a que una variable se convierta a un tipo concreto, se podría forzar la variable o usar la función settype() para ello.

En PHP el identificador de una variable siempre comienza con un signo de dólar ( $ ).

Enteros

Los enteros se puede especificar usando una de las siguientes sintaxis:

$a = 1234; // número decimal
$a = -123; // un número negativo
$a = 0123; // número octal (equivalente al 83 decimal)
$a = 0x12; // número hexadecimal ( equivalente al 18 decimal )

Números en punto flotante

Los números en punto flotante ( "double" ) se pueden especificar utilizando cualquiera de las siguientes sintaxis:

$a = 1.234;
$a = 1.2e3;

Cadenas

Las cadenas de caracteres se pueden especificar usando uno de dos tipos de delimitadores.

Si la cadena está encerrada entre dobles comillas ( " ), las variables que estén dentro de la cadena serán expandidas ( sujetas a ciertas limitaciones de interpretación ). Como en C y en Perl, el carácter de barra invertida (" \ ") se puede usar para especificar caracteres especiales :

Caracteres protegidos

Secuencia

significado

\n

Nueva línea

\r

Retorno de carro

\t

Tabulación horizontal

\\

Barra invertida

\$

Signo del dólar

\"

Comillas dobles

\[0-7]{1,3}

La secuencia de caracteres que coincida con la expresión regular es un carácter en notación octal

\x[0-9A-Fa-f]{1,2}

La secuencia de caracteres que coincida con la expresión regular es un carácter en notación hexadecimal

La segunda forma de delimitar una cadena de caracteres usa el carácter de comilla simple ( ' ). Cuando una cadena va encerrada entre comillas simples, los únicos caracteres de escape que serán comprendidos son "\\" y "\'". Las variables dentro de una cadena delimitada por comillas simples no se expandirán dentro de una cadena.

Otra forma de delimitar cadenas es usando la sintaxis de documento incrustado ( <<< ). Se debe proporcionar un identificador EOD después de <<< y después la cadena.

Ejemplo de entrecomillado de cadenas con sintaxis de documento incrustado :

$str = <<<EOD Ejemplo de cadena Expandiendo múltiples líneas usando sintaxis de documento incrustado.EOD;

Nota : La sintaxis de documento incrustado fue añadida en PHP 4.

Las cadenas se pueden concatenar usando el operador ' . ' ( punto ). Nótese que el operador '+' ( suma ) no aplica para esto.

Se puede acceder a los caracteres dentro de una cadena tratándola como un arreglo de caracteres indexado numéricamente, usando una sintaxis similar a la de C. Vea el siguiente ejemplo :

Ejemplos de cadenas

<?php

/* Asignando una cadena. */

$str = "Esto es una cadena";

/* Añadiendo a la cadena. */

$str = $str . " con algo más de texto";

/* Otra forma de añadir, incluye un carácter de nueva línea protegido. */

$str .= " Y un carácter de nueva línea al final.\n";

/* Esta cadena terminará siendo '<p>Número: 9</p>' */

$num = 9;
$str = "<p>Número: $num</p>";

/* Esta será '<p>Número: $num</p>' */

$num = 9;
$str = '<p>Número: $num</p>';

/* Obtener el primer carácter de una cadena  */

$str = 'Esto es una prueba.';
$first = $str[0];

/* Obtener el último carácter de una cadena. */

$str = 'Esto es aún una prueba.';
$last = $str[strlen($str)-1];

?>

Conversión de cadenas

Cuando una cadena se evalúa como un valor numérico, el valor resultante y el tipo se determinan como sigue.

La cadena se evaluará como un doble si contiene cualquiera de los caracteres '.', 'e', o 'E'. En caso contrario, se evaluará como un entero.

El valor viene dado por la porción inicial de la cadena. Si la cadena comienza con datos de valor numérico, este será el valor usado. En caso contrario, el valor será 0 (cero). Los datos numéricos válidos son un signo opcional, seguido por uno o más dígitos (que opcionalmente contengan un punto decimal), seguidos por un exponente opcional. El exponente es una 'e' o una 'E' seguidos por uno o más dígitos.

Cuando la primera expresión es una cadena, el tipo de la variable dependerá de la segunda expresión.

$foo = 1 + "10.5";                 // $foo es doble (11.5)
$foo = 1 + "-1.3e3";               // $foo es doble (-1299)
$foo = 1 + "bob-1.3e3";            // $foo es entero (1)
$foo = 1 + "bob3";                 // $foo es entero (1)
$foo = 1 + "10 Cerditos";          // $foo es entero (11)
$foo = "10.0 cerdos " + 1;         // $foo es entero (11)
$foo = "10.0 cerdos " + 1.0;       // $foo es double (11)

La siguiente línea le ayudará a comprobar los resultados en un script de PHP :

echo "\$foo==$foo; el tipo es " . gettype( $foo ) . "<br>\n";



Arreglos

En PHP los arreglos actualmente actúan tanto como tablas hash ( arreglos asociativos ) o como arreglos indexados ( vectores ).

Arreglos  Unidimensionales

PHP soporta tanto arreglos escalares como asociativos. Se puede crear una arreglo usando las funciones list() o array(), o se puede asignar el valor de cada elemento del arreglo de manera explícita.

$a[0] = "abc"; 
$a[1] = "def";
$b[“foo”] = 13;

También se puede crear un arreglo simplemente añadiéndole valores a éste. Cuando se asigna un valor a una variable arreglo usando corchetes vacíos, el valor se añadirá al final del arreglo.

$a[] = "hola";   // $a[2] == "hola"
$a[] = "mundo";  // $a[3] == "mundo"

Los arreglos se pueden ordenar usando diversas funciones de PHP : asort(), arsort(), ksort(), rsort(), sort(), uasort() y uksort() dependiendo del tipo de ordenación requerida.

También se puede contar el número de elementos de un arreglo usando la función count() y recorrerlo usando las funciones next() y prev(). Otra forma habitual de recorrer un arreglo es usando la función each().

Arreglos Multidimensionales

Los arreglos multidimensionales son bastante simples actualmente. Para cada dimensión del arreglo, se puede añadir otro valor [clave] al final :

$a[1]        = $f;         // ejemplos de una sola dimensión
$a["foo"]    = $f;   
$a[1][0]     = $f;         // bidimensional
$a["foo"][2] = $f;         // (se pueden mezclar índices numéricos y asociativos)
$a[3]["bar"] = $f;         // (se pueden mezclar índices numéricos y asociativos)
$a["foo"][4]["bar"][0] = $f;   // tetradimensional!

Se pueden "llenar" arreglos multidimensionales de muchas formas, pero la más fácil es comprender cómo usar la función array() para arreglos asociativos. Estos dos ejemplos llenarán el arreglo unidimensional de la misma manera :

// Ejemplo 1: 
$a["color"]  = "rojo";
$a["sabor"]  = "dulce";
$a["forma"]  = "redondeada";
$a["nombre"] = "manzana";
$a[3]        = 4; 
// Ejemplo 2: 
$a = array("color"=>"rojo","sabor"=>"dulce","forma"=>"redondeada","nombre"=>"manzana",3=>4);

Su representación gráfica podría ser la siguiente :

 

$a

color 

rojo

sabor 

dulce

forma 

redondeada

nombre 

manzana

4

La función array() se puede usar para generar arreglos multidimensionales :

<?php
 $a = array("manzana" => array("color"=>"rojo","sabor"=>"dulce","forma"=>"redondeada"),
           "naranja" => array("color"=>"naranja","sabor"=>"ácido","forma"=>"redondeada"),
           "plátano" => array("color"=>"amarillo","sabor"=>"dulce","forma"=>"aplatanada")); 
echo $a["manzana"]["sabor"];    // devolverá "dulce"

?>

Su representación gráfica podría ser la siguiente :

$a

color

sabor

forma

manzana

rojo

dulce

redondeada

naranja

naranja

ácido

redondeada

plátano

amarillo

dulce

aplatanada



Variables

En PHP las variables se representan como un signo de dólar seguido por el identificador de la variable. El nombre de la variable es sensible a minúsculas y mayúsculas.

$var = "Bob";
$Var = "Joe";
echo "$var, $Var"; // produce la salida "Bob, Joe"

PHP4 ofrece otra forma de asignar valores a las variables : asignar por referencia. Esto significa que la nueva variable simplemente referencia ( en otras palabras, "se convierte en un alias de" o "apunta a" ) a la variable original. Los cambios a la nueva variable afectan a la original, y viceversa. Esto también significa que no se produce una copia de valores; por tanto, la asignación ocurre más rápidamente. De cualquier forma, cualquier incremento de velocidad se notará sólo en los ciclos críticos cuando se asignen grandes arreglos u objetos.

Para asignar por referencia, simplemente se antepone un ampersand (&) al comienzo de la variable cuyo valor se está asignando ( la variable fuente ). Por ejemplo, el siguiente código produce la salida ' Mi nombre es Bob ' dos veces:

<?php
$foo = 'Bob';               // Asigna el valor 'Bob' a $foo
$bar = &$foo;               // Referencia $foo vía $bar.
$bar = "Mi nombre es $bar"; // Modificando a $bar...
echo $foo;                  // $foo también se modifica.
echo $bar;

?>

Algo importante a tener en cuenta es que sólo las variables con nombre pueden ser asignadas por referencia.

<?php
$foo = 25;
$bar = &$foo;      // Esta es una asignación válida.
$bar = &(24 * 7);  // Inválida; referencia a una expresión sin nombre. 
function test() {
   return 25;
} 
$bar = &test();    // Inválida.

?>


Ámbito de las variables

El ámbito de una variable es el contexto dentro del que la variable está definida. La mayor parte de las variables en PHP sólo tienen un ámbito simple. Este ámbito simple también abarca los archivos incluidos y los requeridos. Por ejemplo:

$a = 1;
include "b.inc";

Aquí, el ámbito de la variable $a abarca el script incluido en b.inc.

Dentro de las funciones definidas por el usuario aparece un ámbito local a la función. Cualquier variables que se use dentro de una función está, por defecto, limitada al ámbito local de esa función. Por ejemplo :

$a = 1; /* ámbito global */

Function Test () {
    echo $a; /* referencia a una variable de ámbito local */
} 

Test ();

Este script no producirá salida, ya que la orden echo utiliza una versión local de la variable $a, a la que no se ha asignado ningún valor en su ámbito. Puede notarse una pequeña diferencia con el lenguaje C, en el que las variables globales están disponibles automáticamente dentro de la función a menos que sean expresamente sobre escritas por una definición local. Esto puede causar algunos problemas, ya que la gente puede cambiar variables globales inadvertidamente. En PHP, las variables globales deben ser declaradas globales dentro de la función si van a ser utilizadas dentro de ésta.

Ejemplo :

$a = 1;
$b = 2; 
Function Sum () {
    global $a, $b; 
    $b = $a + $b;
} 
Sum ();
echo $b;

El script anterior producirá la salida "3". Al declarar $a y $b globales dentro de la función, todas las referencias a tales variables se referirán a la versión global. No hay límite al número de variables globales que se pueden manipular dentro de una función.

Un segundo método para acceder a las variables desde un ámbito global es usando el arreglo $GLOBALS propio de PHP3. El ejemplo anterior se puede rescribir así :

$a = 1;
$b = 2; 
Function Sum () {
    $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
} 
Sum ();
echo $b;

El arreglo $GLOBALS es un arreglo asociativo con el nombre de la variable global como clave y los contenidos de dicha variable como el valor del elemento del arreglo.

Otra característica importante del ámbito de las variables es la variable static. Una variable estática existe sólo en el ámbito local de la función, pero no pierde su valor cuando la ejecución del programa abandona este ámbito. Consideremos el siguiente ejemplo:

Function Test () {
    $a = 0;
    echo $a;
    $a++;
}

Esta función tiene poca utilidad ya que cada vez que es llamada asigna a $a el valor. La sentencia $a++, que incrementa la variable, no sirve para nada, ya que en cuanto la función termina, la variable $a desaparece. Para hacer una función útil para contar, que no pierda la pista del valor actual del conteo, la variable $a debe declararse como estática:

Function Test () {
    static $a = 0;     echo $a;
   $a++;
}

Ahora, cada vez que se llame a la función Test(), se preservará el valor de $a y se incrementará.

Las variables estáticas también proporcionan una forma de manejar funciones recursivas. Una función recursiva es la que se llama a sí misma. Se debe tener cuidado al escribir una función recursiva, ya que puede ocurrir que se llame a sí misma indefinidamente. Hay que asegurarse de implementar una forma adecuada de terminar la recursión. La siguiente función cuenta recursivamente hasta 10, usando la variable estática $count para saber cuándo parar:

Function Test () {
    static $count = 0;
    $count++;
    echo $count;
    if ($count < 10) {
        Test ();
    }
    $count--;
}


Variables Externas a PHP

Formularios HTML ( GET y POST )

Cuando se envía un formulario a un script PHP, las variables de dicho formulario están disponibles automáticamente  en el script gracias al mismo PHP. Por ejemplo, consideremos el siguiente formulario :

Variables de formulario simples

<form action="foo.php" method="post">
    Nombre: <input type="text" name="nombre"><br>
    <input type="submit">
</form>

Cuando el formulario sea enviado, PHP creará la variable $nombre, que contendrá lo que se introdujo en el campo Nombre : de dicho formulario.

PHP también maneja arreglos en el contexto de variables de formularios, pero sólo en una dimensión. Se puede, por ejemplo, agrupar juntas variables relacionadas, o usar esta característica para recuperar valores de un campo select input múltiple :

Variables de formulario más complejas

<form action="arreglo.php" method="post">
    Nombre : <input type="text" name="persona[name]"><br>
    Email : <input type="text" name="persona[email]"><br>
    Bebida : <br>
    <select multiple name="bebida[]">
        <option value="agua">Agua
        <option value="vino">Vino
        <option value="cerveza">Cerveza
  </select>
    <input type="submit">
</form>

Si la característica de PHP de track_vars está activada, ya sea mediante la opción de configuración track_vars o mediante la directiva <? php_track_vars ?>, las variables enviadas con los métodos POST o GET del formulario, también se encontrarán disponibles en los arreglos asociativos globales $HTTP_POST_VARS y $HTTP_GET_VARS.


Operadores

PHP brinda un conjunto de operadores muy sencillos de utilizar al formar expresiones.

Operadores Aritméticos

Ejemplo

Nombre

Resultado

$a + $b

Adición

Suma de $a y $b.

$a - $b

Substracción

Diferencia entre $a y $b.

$a * $b

Multiplicación

Producto de $a and $b.

$a / $b

División

Cociente de $a entre $b.

$a % $b

Módulo

Resto de $a dividido entre $b.

Operadores de Asignación

El operador básico de asignación es un signo igual " = ". A primera vista se puede pensar que es el operador de comparación "igual que". Pero no, realmente significa que el operando de la izquierda toma el valor de la expresión a la derecha, ( esto es, " toma el valor de " ).

El valor de una expresión de asignación es el propio valor asignado.

Esto es, el valor de $a = 3 es 3. Esto permite hacer cosas importantes como

$a = ($b = 4) + 5;  // ahora $a es igual a 9, y $b vale 4.

Además del operador básico de asignación, existen los "operadores combinados" para todas las operaciones aritméticas y de cadenas que sean binarias. Este operador combinado permite, de una sola vez, usar una variable en una expresión y luego establecer el valor de esa variable al resultado de la expresión. Por ejemplo :

$a = 3;
$a += 5;       // Establece $a a 8, como si hubiésemos escrito: $a = $a + 5;
$b = "Hola ";
$b .= "Ahí!";  // Establece $b a "Hola Ahí!", igual que si hiciésemos $b = $b . "Ahí!";

Observe que la asignación realiza una nueva copia de la variable original ( asignación por valor ), por lo que cambios a la variable original no afectan a la copia. Esto puede tener interés si se requiere copiar algo como un arreglo con muchos elementos dentro de un ciclo que se repita muchas veces ( cada vez se realizará una nueva copia del arreglo ). PHP4 soporta asignación por referencia, usando la sintaxis $var = &$otravar;, pero esto no es posible en PHP3. Asignación por referencia quiere decir que ambas variables acabarán apuntando al mismo dato y que nada se copia realmente.


Operadores Bit a bit

Los operadores bit a bit permiten activar o desactivar bits individuales de un entero.

Ejemplo

Nombre

Resultado

$a & $b

Y

Se activan los bits que están activos tanto en $a como $b.

$a | $b

O

Se activan los bits que están activos en $a o que lo están en $b.

$a ^ $b

Xor ("o exclusiva")

Se activan los bits que están activos en $a o en $b pero no en ambos a la vez.

~ $a

No

Se activan los bits que no están activos en $a.

$a << $b

Desplazamiento a la izquierda

Desplaza los bits de $a, $b posiciones hacia la izquierda (por aritmética binaria, cada posición desplazada equivale a multiplicar por dos el valor de $a)

$a >> $b

Desplazamiento a la derecha

Desplaza los bits de $a, $b posiciones hacia la derecha (por aritmética binaria, cada posición desplazada equivale a dividir entre dos el valor de $a)

Operadores de Comparación

Los operadores de comparación, como su nombre lo indica, permiten comparar dos valores y establecer una relación entre éstos.

Ejemplo

Nombre

Resultado

$a == $b

Igualdad

Cierto si $a es igual a $b.

$a === $b

Identidad

Cierto si $a es igual a $b y si son del mismo tipo (sólo PHP4)

$a != $b

Desigualdad

Cierto si $a no es igual a $b.

$a < $b

Menor que

Cierto si $a es estrictamente menor que $b.

$a > $b

Mayor que

Cierto si $a es estrictamente mayor que $b.

$a <= $b

Menor o igual que

Cierto si $a es menor o igual que $b.

$a >= $b

Mayor o igual que

Cierto si $a es mayor o igual que $b.

Otro operador importante es el condicional o ternario representado por " ? : ", que funciona como en C y otros muchos lenguajes.

(expr1) ? (expr2) : (expr3);

La expresión toma el valor expr2 si expr1 se evalúa a cierto, y expr3 si expr1 se evalúa a falso.


Operadores de Incremento / Decremento

PHP soporta los operadores de pre decremento y post incremento al estilo de C.

Ejemplo

Nombre

Efecto

++$a

Preincremento

Incrementa $a en uno y después devuelve $a.

$a++

Postincremento

Devuelve $a y después incrementa $a en uno.

--$a

Predecremento

Decrementa $a en uno y después devuelve $a.

$a--

Postdecremento

Devuelve $a y después decrementa $a en uno.

Ejemplo :

<?php

echo "<h3>Postincremento</h3>";

$a = 5;
echo "Debe ser 5: ".$a++."<br>\n";
echo "Debe ser 6: ".$a."<br>\n"; 
echo "<h3>Preincremento</h3>";

$a = 5;
echo "Debe ser 6: ".++$a."<br>\n";
echo "Debe ser 6: ".$a."<br>\n";
echo "<h3>Postdecremento</h3>";
$a = 5;
echo "Debe ser 5: ".$a--."<br>\n";
echo "Debe ser 4: ".$a. "<br>\n";
echo "<h3>Predecremento</h3>";
$a = 5;
echo "Debe ser 4: ".--$a. "<br>\n";
echo "Debe ser 4: ".$a. "<br>\n";

?>

Operadores Lógicos

Ejemplo

Nombre

Resultado

$a and $b

Y

Cierto si tanto $a como $b son ciertos.

$a or $b

O

Cierto si $a o $b son ciertos.

$a xor $b

O exclusiva

Cierto si $a es cierto o $b es cierto, pero no ambos a la vez.

! $a

Negación

Cierto si $a no es cierto.

$a && $b

Y

Cierto si tanto $a como $b son ciertos.

$a || $b

O

Cierto si $a o $b son ciertos.

La razón de las dos variaciones de "y" y "o" es que operan con distinta precedencia


Precedencia de Operadores

La precedencia de operadores especifica cómo se agrupan las expresiones. Por ejemplo, en la expresión 1 +  5 * 3, la respuesta es 16 y no 18 porque el operador de multiplicación (" * ") tiene una mayor precedencia que el de adición (" + ").

La siguiente tabla lista la precedencia de operadores, indicándose primero los de menor precedencia.

Asociatividad

Operadores

izquierda

,

izquierda

or

izquierda

xor

izquierda

and

derecha

print

izquierda

= += -= *= /= .= %= &= |= ^= ~= <<= >>=

izquierda

? :

izquierda

||

izquierda

&&

izquierda

|

izquierda

^

izquierda

&

no asociativo

== != ===

no asociativo

< <= > >=

izquierda

<< >>

izquierda

+ - .

izquierda

* / %

derecha

! ~ ++ -- (int) (double) (string) (array) (object) @

derecha

[

no asociativo

new


Operadores de Cadenas

Hay dos operadores de cadenas. El primero es el operador de concatenación punto ( . ), que devuelve el resultado de concatenar sus operandos izquierdo y derecho. El segundo es el operador de concatenación y asignación punto igual ( .= ).

$a = "Hola ";
$b = $a . "Mundo!"; // ahora $b contiene "Hola Mundo!"
$a = "Hola ";
$a .= "Mundo!";     // ahora $a contiene "Hola Mundo!"


Sentencias

Todo archivo de comandos PHP se compone de una serie de sentencias. Una sentencia puede ser una asignación, una llamada a función, un ciclo, una sentencia condicional e incluso una sentencia que no haga nada ( una sentencia vacía ). Las sentencias normalmente acaban con punto y coma. Además, las sentencias  pueden contener grupos de sentencias encerradas entre llaves. Un grupo de sentencias es también una sentencia.

Estructura de decisión if

La construcción if es una de las más importantes características de muchos lenguajes, incluido PHP. Permite la ejecución condicional de fragmentos de código. PHP define una estructura if que es similar a la de C:

if (expr)
   sentencia

Donde expr se evalúa y utiliza como valor condicional. Si expr evalúa a verdadero ( TRUE ), PHP ejecutará la sentencia y si se evalúa a falso ( FALSE ) la ignorará.

El siguiente ejemplo mostraría a es mayor que b si $a fuera mayor que $b :

if ($a > $b)
   print "a es mayor que b";

A menudo, se desea tener más de una sentencia ejecutada de forma condicional. Por supuesto, no hay necesidad de encerrar cada sentencia con una cláusula if. En vez de eso, se pueden agrupar varias sentencias. Por ejemplo, este código mostraría a es mayor que b si $a fuera mayor que $b, y entonces asignaría el valor de $a a $b :

if ($a > $b) {
   print "a es mayor que b";
   $b = $a;
}

Las sentencias if se pueden anidar indefinidamente dentro de otras sentencias if, lo cual proporciona una flexibilidad completa para ejecuciones condicionales en las diferentes partes del programa.

else

A menudo queremos ejecutar una sentencia si se cumple una cierta condición y otra sentencia distinta si la condición no se cumple. Esto es para lo que sirve else. El complemento else extiende una sentencia if para ejecutar una sentencia en caso de que la expresión en la sentencia if se evalúe como falsa. Por ejemplo, el siguiente código mostraría a es mayor que b si $a fuera mayor que $b, y a NO es mayor que b en cualquier otro caso :

if ($a > $b) {
   print "a es mayor que b";
}
else {
   print "a NO es mayor que b";
}

elseif

elseif, como su nombre lo sugiere, es una combinación de if y else. Como else, extiende una sentencia if para ejecutar una sentencia diferente en caso de que la expresión if original sea evaluada como falsa. No obstante, a diferencia de else, se ejecutará expresión alternativa solamente si la expresión condicional elseif se evalúa como TRUE. Por ejemplo, el siguiente código mostraría a es mayor que b, a es igual a b o a es menor que b:

if ($a > $b) {
   print "a es mayor que b";
} elseif ($a == $b) {
   print "a es igual que b";
} else {
   print "a es mayor que b";
}

Puede haber varios elseif’s dentro de la misma sentencia if. La primera expresión elseif ( si hay alguna ) que se evalúe como verdadero se ejecutaría. En PHP, también se puede escribir else if ( con dos palabras ) y el comportamiento sería idéntico al de un elseif ( una sola palabra ). El significado sintáctico es ligeramente distinto pero la línea básica es que ambos resultarían tener exactamente el mismo comportamiento.

La sentencia elseif se ejecuta sólo si la expresión if precedente y cualquier expresión elseif precedente se evalúan como falsas y la expresión elseif actual se evalúa como verdadera.


Estructura cíclica while

Los ciclos while son los más simples en PHP. Se comportan como 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 la(s) sentencia(s) anidada(s) repetidamente, mientras la expresión while se evalúe como verdadera. El valor de la expresión es comprobado cada vez al principio del ciclo, así que incluso si este valor cambia durante la ejecución de la(s) sentencia(s) anidada(s), la ejecución no parará hasta el fin de la iteración ( cada vez que PHP ejecuta las sentencias en el ciclo es una iteración ). A veces, si la expresión while se evalúa como falso desde el principio de todo, la(s) sentencia(s) anidada(s) no se ejecutarán ni siquiera una vez.

Como con la sentencia while, se pueden agrupar múltiples sentencias dentro del mismo ciclo while, encerrando un grupo de sentencias con llaves, o usando la sintaxis alternativa :

while (expr): sentencia ... endwhile;

Los siguientes ejemplos son idénticos y ambos imprimen números del 1 al 10:

/* ejemplo 1 */

$i = 1;
while ($i <= 10) {
    print $i++;  /* el valor impreso sería $i antes del incremento ( post-incremento ) */
}
/* ejemplo 2 */
$i = 1;
while ($i <= 10):
    print $i;
    $i++;
endwhile; 


Estructura cíclica
do..while

Los ciclos do..while son muy similares a los ciclos while, excepto que las condiciones se comprueban al final de cada iteración en vez de al principio. La principal diferencia frente a los ciclos regulares while es que se garantiza la ejecución de la primera iteración de un ciclo do..while ( la condición se comprueba sólo al final de la iteración ), mientras que puede no ser necesariamente ejecutada con un ciclo while regular ( la condición se comprueba al principio de cada iteración, si esta se evalúa como falsa desde el principio la ejecución del ciclo finalizará inmediatamente ).

Hay una sola sintaxis para los ciclos do..while :

$i = 0;
do {
   print $i;
}while ($i>0);

El ciclo de arriba se ejecutaría exactamente una sola vez, después de la primera iteración, cuando la condición se comprueba, se evalúa como falsa ( $i no es más grande que 0 ) y la ejecución del ciclo finaliza.

Los usuarios avanzados de C pueden estar familiarizados con un uso distinto del ciclo do..while, que permite detener la ejecución en medio del bloques de código, encapsulándolo con un do..while(0) y usando la sentencia break para salir. El siguiente fragmento de código demuestra esto :

do {
     if ($i < 5) {
         print "i no es lo suficientemente grande";
         break;
     }

     $i *= $factor;
     if ($i < $minimum_limit) {
         break;
     }
     print "i es correcto";
     ...procesa i...

} while(0);  // Ciclo infinito controlado con break


Estructura cíclica  for

Los ciclos for son más complejos en PHP. Se comportan como su contrapartida en C. La sintaxis de un ciclo for es :

for (expr1; expr2; expr3) sentencia

La primera expresión ( expr1 ) se evalúa o ejecuta incondicionalmente una vez al principio del ciclo.

Al comienzo de cada iteración, se evalúa expr2 . Si se evalúa como verdadera, el ciclo continúa y las sentencias anidadas se ejecutan. Si se evalúa como falsa, la ejecución del ciclo finaliza. Al final de cada iteración, se evalúa expr3.

Cada una de las expresiones puede estar vacía. Que expr2 esté vacía significa que el ciclo debería correr indefinidamente ( PHP implícitamente lo considera como verdadero, al igual que C ). Esto puede que no sea tan inútil como se podría pensar, puesto que a menudo se quiere salir de un ciclo usando una sentencia break condicional en vez de usar la condición del for.

Considere los siguientes ejemplos. Todos ellos muestran números del 1 al 10:

/* ejemplo 1 */

for ($i = 1; $i <= 10; $i++) {     print $i;
}
/* ejemplo 2 */
for ($i = 1;;$i++) {
    if ($i > 10) {        break;
    }
    print $i;
}
/* ejemplo 3 */

$i = 1;
for (;;) {
    if ($i > 10) {
       break;
    }
    print $i;
    $i++;
}
/* ejemplo 4 */
for ($i = 1; $i <= 10; print $i, $i++) ;

PHP también soporta la "sintaxis de dos puntos" alternativa para ciclos for.

for (expr1; expr2; expr3): sentencia; ...; endfor;

break

break cambia incondicionalmente el flujo de ejecución hacia afuera de las siguientes estructuras :  for, while, o switch.

break accepta un parámetro opcional, el cual determina de cuántas estructuras de control debe que salir.

continue

continue se usa dentro de la estructura del ciclo para saltar el resto de la iteración actual en éste y continuar la ejecución al comienzo de la siguiente iteración.

continue accepta un parámetro opcional, el cual determina cuántos niveles de ciclos debe que saltar antes de continuar con la ejecución.


Estructura de decisión switch

La sentencia switch es similar a una serie de sentencias if en la misma expresión. En muchas ocasiones, se quiere comparar la misma variable ( o expresión ) con muchos valores diferentes y ejecutar una parte de código distinta dependiendo de a qué valor sea igual. Para ello sirve la sentencia switch.

Los siguientes dos ejemplos son dos modos distintos de escribir la misma estructura, uno usa una serie de sentencias if y el otro usa la sentencia switch :

if ($i == 0) {
   print "i es igual a 0";
}
if ($i == 1) {
   print "i es igual a 1";
}
if ($i == 2) {
   print "i es igual a 2";
}
switch ($i) {
   case 0:
        print "i es igual a 0";
        break;
   case 1:
        print "i es igual a 1";
        break;
   case 2:
        print "i es igual a 2";
       break;
}

Es importante entender cómo se ejecuta la sentencia switch para evitar errores. La sentencia switch se ejecuta línea por línea ( realmente, sentencia a sentencia ). Al comienzo, no se ejecuta código. Sólo cuando se encuentra una sentencia case con un valor que coincide con el valor de la expresión switch. y PHP comienza a ejecutar las sentencias. PHP seguirá ejecutando las sentencias hasta el final del bloque switch o hasta la primer sentencia break que encuentre. Si hay una sentencia break al final de una lista de sentencias case, PHP seguirá ejecutando las sentencias del siguiente case. Por ejemplo :

switch ($i) {
     case 0:
         print "i es igual a 0";
     case 1:
         print "i es igual a 1";
     case 2:
         print "i es igual a 2";
}

Aquí, si $i es igual a 0, ¡PHP ejecutaría todas las sentencias print!. Si $i es igual a 1, PHP ejecutaría las últimas dos sentencias print y sólo si $i es igual a 2, se obtendría la conducta 'esperada' y solamente se mostraría ‘i es igual a 2'. Así, es importante no olvidar las sentencias break ( incluso aunque pueda querer evitar escribirlas intencionalmente en ciertas circunstancias ).

En una sentencia switch, la condición se evalúa sólo una vez y el resultado se compara en cada sentencia case. En una sentencia elseif, la condición se evalúa otra vez. Si la condición es más compleja que una comparación simple y se está dentro de un ciclo corto, una estructura switch puede ser más conveniente.

La lista de sentencias de un case puede también estar vacía, lo cual simplemente pasa el control a la lista de sentencias del siguiente case.

switch ($i) {
     case 0:
     case 1:
     case 2:
         print "i es menor que 3, pero no negativo";
         break;
     case 3:
         print "i es 3"; }

Un caso especial es el default. Este tipo de case coincide con todo lo que no coincidieron los otros case. Por ejemplo:

switch ($i) {
     case 0:
         print "i es igual a 0";
         break;
     case 1:          print "i es igual a 1";          break;      case 2:          print "i es igual a 2";          break;      default:          print "i no es igual a 0, 1 o 2"; }

La expresión case puede ser cualquier expresión que se evalúe a un tipo simple, es decir, números enteros,  de punto flotante o cadenas de texto. No se puede usar aquí ni arreglos ni objetos a menos que se conviertan a un tipo simple.

La sintaxis alternativa para las estructuras de control, antes mencionada, está disponible para el switch.

switch ($i):
     case 0:
         print "i es igual 0";
         break;
     case 1:
         print "i es igual a 1";
         break;
     case 2:
         print "i es igual a 2";
         break;
    default:
    print "i no es igual a 0, 1 o 2";
endswitch;


Funciones definidas por el usuario

Una función se define con la siguiente sintaxis :

function foo ($arg_1, $arg_2, ..., $arg_n) {
   echo "Función de ejemplo.\n";
   return $retval;
}

Pasar parámetros por referencia

Por defecto, los parámetros de una función se pasan por valor ( de manera que si cambias el valor del argumento dentro de la función, no se ve modificado fuera de ella ). Si desea permitir a una función modificar sus parámetros, se deben pasar por referencia.  Esto se logra anteponiendo un ampersand ( & ) al nombre del parámetro en la definición de la función:

function add_some_extra(&$string) {
    $string .= ' y algo más.';
}
$str = 'Esto es una cadena, ';
add_some_extra($str); 
echo $str;    // Saca 'Esto es una cadena, y algo más.' 


Funciones MySQL

PHP brinda un conjunto muy amplio de funciones que permiten acceder a servidores de bases de datos utilizando MySQL.

Puede encontrar más información sobre MySQL en  http://www.mysql.com/

A continuación se presentan las funciones más utilizadas en PHP para manejar una base de datos con MySQL. Ejemplos completos de su uso se analizarán en la siguiente sección del curso.

Tabla de Funciones MySQL

Función

Descripción

mysql_affected_rows 

Devuelve el número de filas afectadas de la última operación MySQL

mysql_change_user

Cambia el usuario conectado en la conexión activa

mysql_client_encoding

Devuelve el nombre del juego de caracteres

mysql_close

Cierra el enlace con MySQL

mysql_connect

Abre una conexión a un servidor MySQL

mysql_create_db 

Crea una base MySQL

mysql_data_seek 

Mueve el puntero interno

mysql_db_name 

Obtener datos de resultado

mysql_db_query 

Envía una sentencia MySQL al servidor

mysql_drop_db

Borra una base de datos MySQL

mysql_errno

Devuelve el número del mensaje de error de la última operación MySQL

mysql_error

Devuelve el texto del mensaje de error de la última operación MySQL

mysql_escape_string

Escapa una cadena para su uso en mysql_query.

mysql_fetch_array

Extrae la fila de resultado como una matriz asociativa

mysql_fetch_assoc

Recupera una fila de resultado como una matriz asociativa

mysql_fetch_field

Extrae la información de una columna y la devuelve como un objeto.

mysql_fetch_lengths

Devuelve la longitud de cada salida en un resultado

mysql_fetch_object 

Extrae una fila de resultado como un objeto

mysql_fetch_row 

Devuelve una fila de resultado como matriz

mysql_field_flags 

Devuelve los flags asociados con el campo especificado en un resultado

mysql_field_len 

Devuelve la longitud del campo especificado

mysql_field_name 

Devuelve el nombre del campo especificado en un resultado

mysql_field_seek 

Asigna el puntero del resultado al offset del campo especificado

mysql_field_table 

Devuelve el nombre de la tabla donde esta el campo especificado

mysql_field_type 

Devuelve el tipo del campo especificado en un resultado

mysql_free_result 

Libera la memoria del resultado

mysql_get_client_info 

Obtener información del cliente MySQL

mysql_get_host_info 

Obtener información de la máquina anfitriona MySQL

mysql_get_proto_info 

Obtener información del protocolo MySQL

mysql_get_server_info 

Obtener información del servidor MySQL

mysql_info 

Obtiene información sobre la consulta más reciente

mysql_insert_id 

Devuelve el identificador generado en la última llamada a INSERT

mysql_list_dbs 

Lista las bases de datos disponibles en el servidor MySQL

mysql_list_fields

Lista los campos del resultado de MySQL

mysql_list_processes 

Lista los procesos MySQL

mysql_list_tables 

Lista las tablas en una base de datos MySQL

mysql_num_fields 

Devuelve el numero de campos de un resultado

mysql_num_rows 

Devuelve el numero de filas de un resultado

mysql_pconnect 

Abre una conexión persistente al servidor MySQL

mysql_ping 

Efectuar un chequeo de respuesta (ping) sobre una conexión de servidor o reconectarse si no hay conexión

mysql_query 

Envía una sentencia SQL a MySQL

mysql_real_escape_string 

Escapa caracteres especiales de una cadena para su uso en una sentencia SQL, tomando en cuanto el juego de caracteres actual de la conexión.

NOTA IMPORTANTE : El material expuesto en esta sección fue extraído, revisado, complementado y sintetizado de los manuales oficiales de PHP que puede encontrar en el sitio : http://www.php.net/

 


I.S.C. Ricardo González González