PHP sin fronteras

En este curso abordaremos los procedimientos comunes de programación en lenguaje PHP.

Estructura y sintáxis

MARCADORES

<?php ... ?> Bloque de código PHP.
Lo que no esté dentro de estos marcadores se envía directamente a la salida.
// ó # ... Comentario en una línea.
/* ... */ Comentario multilínea (no anidable).
' ... ' Cadena simple.
Para incluir el caracter ' (apóstrofe) en una cadena simple hay que ponerle delante una barra invertida (caracter de escape).
Para incluir una barra invertida justo delante del apóstrofe final hay que añadirle delante otra barra invertida.
" ... " Cadena interpretable.
En una cadena interpretable las variables invocadas son sustituidas por su dato convertido a tipo cadena.
Para incluir el caracter " (comillas) en una cadena interpretable hay que ponerle delante una barra invertida (caracter de escape).
Para incluir una barra invertida justo delante del caracter comillas final hay que añadirle delante otra barra invertida.
[ ... ] Elemento de una matriz.
( ... ) Delimitadores de expresiones o parámetros.
{ ... } Bloque de instrucciones, delimitadores de caracter en una cadena, o delimitadores de un nombre de variable en una expresión ambigua.
; Separador de instrucciones.
, Separador de expresiones o parámetros.
@ No enviar a salida un posible mensaje de error.
Se pone a la izquierda de la instrucción afectada.
\ Caracter de escape.
Sirve para marcar caracteres que de otra manera podrían confundir al intérprete.
Inicia las llamadas secuencias de escape que serán sustituidas por su valor real.

En una cadena interpretable las secuencias de escape reconocidas son:
\n salto de línea (caracter 10 en ASCII)
\r retorno de carro (caracter 13 en ASCII)
\t tabulador (caracter 9 en ASCII)
\$ signo de dolar (para no confundir con el principio de un nombre de variable).
\" Comillas
\\ barra invertida
\número El número puede estar compuesto de 1 a 3 dígitos de 0 a 7 representando el código de un caracter en notación octal.
\xnúmero El número puede estar compuesto de 1 o 2 dígitos de 0 a 9 y de a á f ó de A á F, representando el código de un caracter en notación hexadecimal.
En cualquier otro caso la barra invertida permanecerá como tal.

En una cadena simple sólo se reconocen dos secuencias de escape:
\' Apóstrofe
\\ barra invertida
En cualquier otro caso la barra invertida permanecerá como tal.

TIPOS DE DATO


VARIABLES

Creación y uso

Los nombres deben empezar por $ (signo de dolar).
El caracter a continuación debe ser un _ subrayado) o una letra, y después cualquier combinación de subrayados, letras y números. Las letras mayúsculas y minúsculas se consideran diferentes.
Además de los caracteres de 'a' a 'z' y de 'A' a 'Z', para los nombres se consideran letras los caracteres ASCII del 127 al 255.

Hay variables ya creadas por el intérprete que pueden usarse directamente, las demás se crean al asignarles un dato.
El tipo de una variable es determinado por el contexto. Al usar una variable no creada se considera de tipo NULL.

Variables como referencia a otras variables

(su uso es poco frecuente)

A una variable se le puede asignar la referencia de otra, anteponiendo a ésta un & (ampersand). Ejemplo:

$a = 'coco'; $b = &$a;
Con esto, $a y $b apuntan al mismo dato ('coco'), que puede usarse o cambiarse por cualquiera de ellas.

A una variable se le puede dar nombre con el contenido de otra variable de tipo cadena. Ejemplo:

$a = 'hola'; $$a = 'mundo';
Con esto se crea una variable $hola que contiene 'mundo'.

También puede referenciarse una variable con su nombre contenido en otra, poniendo ésta entre llaves. Ejemplo:

$hola = 'mundo'; $c = 'hola'; echo ${$c};
Con esto se mostrará 'mundo' en el navegador.

MATRICES

Una matriz puede considerarse una variable especial que apunta a una lista de parejas clave/dato.

Se puede crear con:

$matriz = array(lista_de_elementos_separados_por_coma);
En la definición de una lista un elemento puede ser solo un dato (al que se le asignará una clave numérica), o una pareja clave/dato en la forma:
clave => dato

La clave puede ser un número entero o una cadena.
El dato puede ser cualquier valor, incluso otra matriz.
Si no se especifica la clave, se le asignará la clave entera mayor que tenga la matriz + 1.
Si se especifica la clave y ésta ya existe en la matriz, se sustituirá su dato con el nuevo.

Los elementos de la matriz se referencian como:
$matriz[clave]
Si el dato es otra matriz, sus elementos se referencian como:
$matriz[clave][clave2]
y así sucesivamente.

CONSTANTES

Las constantes referencian a datos que una vez definidos no se pueden cambiar.

Las reglas de formación de nombres de constantes son las mismas que las de nombres de variables excepto que los nombres de las constantes NO empiezan con $, y por convención se escriben en mayúsculas.

Hay constantes ya predefinidas que pueden usarse directamente, las demás se crean con la función:
define(nombre, dato, sensibilidad);

El nombre tiene que ser de tipo cadena y el dato tiene que ser de tipo escalar.

Sensibilidad se refiere a si el nombre de la constante será sensible o no a mayúsculas/minúsculas. Si es TRUE la constante podrá usarse con las letras de su nombre en mayúsculas o minúsculas indistintamente, si es FALSE tendrá que usarse con el nombre tal como se haya definido. Este parámetro puede omitirse (no es frecuente ponerlo) y por defecto asume FALSE.

Las constantes pueden ser definidas y accedidas en cualquier ámbito.


EXPRESIONES

Una expresión es cualquier construcción que de como resultado un dato.

PHP es un lenguaje orientado a expresiones, por lo que casi todo son expresiones.

Expresiones son un dato explícito, un nombre de variable, una función, y combinaciones de éstos con operadores.


OPERADORES

Un operador realiza una acción sobre el dato o datos (operando/s) a los que se asocia, y esta acción produce un dato como resultado.
El conjunto de operandos y operadores es una expresión, y a su vez los operandos pueden ser el resultado de otras expresiones.


Precedencia de operadores

En una expresión los operadores actúan en un orden determinado, salvo que se indique su prioridad por medio de paréntesis, de manera que primero se harán las operaciones contenidas en los paréntesis de dentro afuera, y en cada nivel de paréntesis según la precedencia establecida para cada operador. Cuando los operadores tienen la misma precedencia, actúan en orden de izquierda a derecha.

También pueden usarse los paréntesis para aumentar la legibilidad del código.

Esta es la lista de mayor a menor precedencia, teniendo la misma los de cada línea:

Hay que observar que && y || tienen mayor precedencia que AND y OR.


INSTRUCCIONES

Las instrucciones son los diferentes pasos que tiene que ir ejecutando el programa.

Muchas expresiones pueden considerarse instrucciones, pero no todas: para que una expresión sea una instrucción su resultado tiene que haber quedado almacenado de manera que pueda ser utilizado por instrucciones posteriores.
Por el contrario, las instrucciones puras no pueden considerarse expresiones, pues no producen un resultado en forma de dato que pueda usarse después en el mismo programa, por ejemplo pueden estar enviando información dirigida al usuario o controlando el flujo de instrucciones que se van ejecutando.

Las instrucciones se separan con ; (punto y coma) y pueden agruparse una o varias (o ninguna) encerrándolas entre llaves { }.
Un bloque de instrucciones así agrupadas también se considera una instrucción, es decir, donde pueda ir una instrucción también podrá ir un bloque de instrucciones entre llaves. Y también podría no ir ninguna.

Instrucciones generales

Instrucciones de control de ejecución


FUNCIONES

Una función es un bloque de instrucciones que se define con un nombre y se ejecuta al ser invocada por su nombre. La función puede devolver un dato como resultado, por lo que una función invocada puede considerarse, o formar parte como un operando de, una expresión.

PHP ya incorpora muchas funciones, la mayoría preparadas para su uso, y otras en extensiones que es necesario activar en la configuración para que se puedan usar.

Definición general de función

function nombre_funcion ( lista_de_parámetros_separados_por_coma )
{
  global lista_de_variables_globales_separadas_por_coma ;
  static $variable ;
  otras instrucciones
  return dato_de_retorno ;
}

Los parámetros son nombres de variables que serán usadas por las instrucciones de la función. No tienen nada que ver con otras posibles variables creadas con el mismo nombre fuera de la función (ver Ámbito de las variables).
A las variables parámetro se les asignan los datos por su orden en la lista de izquierda a derecha, y se les puede asignar un valor explícito por defecto por si se omiten al invocar la función.

La lista de parámetros puede estar vacía, pero no pueden omitirse los paréntesis.

Las instrucciones declarativas global y static son opcionales, sólo se ponen cuando es necesario.

La función puede opcionalmente devolver un dato como resultado, por medio de la instrucción return.

Invocación de función

nombre_funcion ( lista_de_expresiones_separadas_por_coma );
ó
$retorno = nombre_funcion ( lista_de_expresiones_separadas_por_coma );

La lista de expresiones debe ir en el mismo orden que la lista de parámetros. Si se omite alguna debe mantenerse la coma de separación, excepto si son las últimas de la derecha.

La lista de expresiones puede estar vacía, pero no pueden omitirse los paréntesis.

Ámbito de las variables

Dentro de una función las variables tienen su propio espacio, de manera que si se referencia una variable creada fuera de ella saldrá un aviso de que la variable no existe; asimismo pueden crearse y referenciarse dentro de la función variables con el mismo nombre que otras ya existentes fuera de la función, pero éstas desaparecerán cuando la función termine, y las variables fuera de la función seguirán como estaban.

Las variables creadas fuera de cualquier función se denominan GLOBALES.

Las variables creadas dentro de una función (incluidos sus parámetros) se denominan LOCALES. Las variables locales desaparecen cuando termina la función.

Para poder usar variables globales dentro de una función se tienen que declarar como tales por medio de la instrucción:

global lista_de_variables_globales_separadas_por_coma;
o referenciándolas directamente como:
$GLOBALS['nombre_variable']		(ojo: nombre_variable sin $ inicial)

$GLOBALS es una variable de tipo matriz que además de ser global no se tiene que declarar como tal y puede ser accedida desde cualquier ámbito. A estas variables especiales creadas por el propio intérprete se las denomina SUPERGLOBALES.

Si se necesita que variables creadas dentro de una función no desaparezcan cuando termine la función (es decir, que permanezcan con su valor cuando vuelva a invocarse la función), hay que declararlas como ESTÁTICAS por medio de la instrucción:

static $variable;

Las variables estáticas, como las locales, solo se reconocen dentro del ámbito de la función.

Referencias a variables

(su uso es poco frecuente)

Cuando se invoca una función, a cada uno de sus parámetros se les asigna por valor el dato correspondiente de la lista, pero puede indicarse en la definición de la función que se asignen referencias a variables en lugar de su valor poniendo un & (ampersand) a la izquierda de los parámetros. Ejemplo:

function ejemplo ($parm1, &$parm2)
{
   $parm2 = $parm1;
}
$var1 = 'hola';

ejemplo ('adios', $var1);
echo $var1;

Tras la ejecución de este fragmento de código, $var1 contendrá 'adios', y se enviará ese dato a la salida. Observemos que como el segundo parámetro se ha definido como referencia a una variable, en la invocación de la función el segundo dato de la lista tiene que ser una variable y no cualquier otra expresión. (Ver Referencias a variables).
Otra a cosa a considerar es que $var1 podría no ser una variable global pues la función ejemplo() podría ser invocada desde dentro de otra función.

Una función también puede devolver una referencia a una variable, poniendo un & (ampersand) a la izquierda del nombre de la función al definirla y también al invocarla. Ejemplo:

$var1 = 1; $var2 = 2;

function &ejemplo ()
{
   global $var1, $var2;
   if ($var1 < $var2) return $var1;
   return $var2;
}

$var3 = &ejemplo ();
$var3 = 'pepe';
echo $var1 . ' ' . $var2;

Tras la ejecución de este fragmento de código, $var3 referenciará a $var2 o a $var1 si el dato de ésta es menor que el de $var2.
Como el dato de $var1 es menor, se mostrará 'pepe 2'.