Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PH P 4
Página 4/115
Iniciación a PHP 4 1.- CONCEPTOS BÁSICOS
Hay cuatro conjuntos de etiquetas que pueden ser usadas para denotar bloques de código
PHP. De estas cuatro, sólo 2 (<?php. . .?> y <script language="php">. . .</script>) están siempre
disponibles; el resto pueden ser configuradas en el fichero de php.ini para ser o no aceptadas por el
intérprete. Mientras que el formato corto de etiquetas (short-form tags) y el estilo ASP (ASP-style
tags) pueden ser convenientes pero no son portables como la versión de formato largo de etiquetas.
Además, si se pretende embeber código PHP en XML o XHTML, será obligatorio el uso del formato
<?php. . .?> para la compatibilidad con XML.
Las etiquetas soportadas por PHP son:
1. <?php echo "si quieres servir documentos XHTML o XML, haz como aquí;\n"; ?>
3. <script language="php">
echo "muchos editores (como FrontPage) no aceptan instrucciones de procesado";
</script>
El método primero, <?php. . .?>, es el más conveniente, ya que permite el uso de PHP en
código XML como XHTML.
El método segundo no siempre está disponible. El formato corto de etiquetas está disponible con la
función short_tags(), activando el parámetro del fichero de configuración de PHP short_open_tag, o
compilando PHP con la opción --enable-short-tags del comando configure. Aunque esté activa por
defecto en php.ini-dist, se desaconseja el uso del formato corto de etiquetas por temas de
compatibilidad.
El método cuarto sólo está disponible si se han activado las etiquetas ASP en el fichero de
configuración: asp_tags.
Nota: El soporte de etiquetas ASP se añadió en la versión 3.0.4.
Nota: No se debe usar el formato corto de etiquetas cuando se desarrollen aplicaciones o librerías
con intención de redistribuirlas, o cuando se desarrolle para servidores que no están bajo nuestro
control, porque puede ser que el formato corto de etiquetas no esté soportado en el servidor. Para
generar código portable y redistribuíble, asegúrate de no usar el formato corto de etiquetas.
Nota: La etiqueta de fin código php, ?>, lleva implícito el punto y coma y por tanto no es necesario
añadirlo al final de la línea anterior.
<?php
if ($expression){
?>
<strong>Esto es verdadero.</strong>
<?php
} else {
?>
<strong>Esto es falso.</strong>
Página 5/115
Iniciación a PHP 4 1.- CONCEPTOS BÁSICOS
<?php
}
?>
Este ejemplo realiza lo esperado, ya que cuando PHP encuentra las etiquetas ?> de fin de
bloque, empieza a escribir lo que encuentra tal cual hasta que encuentra otra etiqueta de inicio de
bloque. Para escribir bloques grandes de texto generalmente es más eficiente separaros del código
PHP que enviar todo el texto mediante las funciones echo(), print() o similares.
<html>
<head>
<title>
<?
print “Ejemplo de Múltiples scripts”;
$var=5;
?>
</title>
</head>
<body>
<?
$var = $var + $var; // Hacemos 5+5
echo “5 + 5 = $var”;
?>
</body>
</html>
<?php
echo "Esto es una prueba"; // Esto es un comentario de una sóla línea tipo C/C++
/* Esto es un comentario de
varias líneas */
echo "Esto es otra prueba";
echo "Esta es la última prueba"; # Este es un comentario de tipo línea de comandos (Linux)
?>
Los estilos de comentarios de una linea actualmente sólo comentan hasta el final de la linea
o el bloque actual de código PHP, lo primero que ocurra.
Página 6/115
Iniciación a PHP 4 1.- CONCEPTOS BÁSICOS
Hay que tener cuidado con no anidar comentarios de estilo 'C', algo que puede ocurrir al
comentar bloques largos de código.
<?php
/*
echo "Esto es una prueba"; /* Este comentario creará un problema*/
*/
?>
Página 7/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
Las variables se crean siguiendo este esquema y siempre con el signo de dólar delante:
$nombre = valor;
2.1.- Enteros
Los enteros se puede especificar usando una de las siguientes sintaxis:
Enteros en base 8 (Octal) y en base 16 (Hexadecimal) también están permitidos. Los valores
en octal comienzan con el dígito 0 mientras que los valores en hexadecimal comienzan por 0x ó 0X.
2.3.- 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 (se sustituyen por su valor). 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
Página 8/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
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 \'. Esto es por convenio, así se pueden tener comillas simples y barras
invertidas en una cadena entre comillas simples. Las variables no se expandirán dentro de una
cadena entre comillas simples.
$comida=”pizza”;
echo $frase_1;
// Dará como salida: Mi comida favorita es la pizza.
echo $frase_2;
// Dará como salida: Mi comida favorita es la $comida.
$str = <<<CAD
Ejemplo de cadena
Expandiendo múltiples líneas
usando sintaxis de documento incrustado.
CAD;
Las cadenas se pueden concatenar usando el operador '.' (punto). Nótese que el operador '+'
(suma) no sirve para esto.
echo $str;
/*
Esto dará como salida:
Esta es una cadena con un poco más de texto
*/
Se puede acceder a los caracteres dentro de una cadena tratándola como un array (vector)
de caracteres indexado numéricamente, usando una sintaxis similar a la de C. Veamos un ejemplo
más abajo.
<?php
/* Obtener el primer carácter de una cadena */
$str = 'Esto es una prueba.';
$first = $str[0];
Página 9/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
echo $first;
// Dará como salida: E
echo $last
// Dará como salida: .
?>
Como se ha visto en el ejemplo anterior, la función strlen() permite calcular la longitud de una
cadena.
También puede ser conveniente insertar dentro de una cadena código html que describa el
formato de la cadena. Los siguientes ejemplos son equivalentes y darán por pantalla el mismo
resultado:
<?php
/* Ejemplo 1 */
$cadena=”Esta línea debe estar en negrita”;
echo “<strong>$cadena</strong>”;
/* Ejemplo 2 */
$cadena=”<strong>Esta línea debe estar en negrita</strong>”;
echo $cadena;
/* Ejemplo 3 */
$cadena=”Esta línea debe estar en negrita”;
$format_ini=”<strong>”;
$format_fin=”</strong>”;
echo “$format_ini$cadena$format_fin”;
/*
Los tres ejemplos darán la misma salida por pantalla:
Esta línea debe estar en negrita
*/
?>
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.
Página 10/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
Si se quisiera probar cualquiera de los ejemplos de esta sección, basta cortar y pegar los ejemplos e
insertar la siguiente línea para ver lo que va ocurriendo:
Un vector no es más que una lista de elementos. Existen dos tipos de vectores: aquellos que
son accedidos mediante la posición que ocupa el elemento y aquellos que son accedidos mediante
una clave asociada al elemento en cuestión. Los primeros se llaman arrays escalares y los segundos
arrays asociativos. En realidad php los trata de la misma manera.
Se puede crear una array usando la función array() o bien se puede asignar el valor de cada
elemento del array de manera explícita.
Escalares
Para acceder al vector utilizamos un número entero que denota la posición del elemento:
$nombre_vect[pos]
$comidas[0]=”Tortilla”;
$comidas[1]=”Pollo Frito”;
$comidas[2]=”Tofu”;
$comidas=array(”Tortilla”,”Pollo Frito”,”Tofu”);
También es conveniente comentar que se pueden añadir elementos al final del vector sin más
que asignar un valor al vector pero con los corchetes vacíos:
$comidas[]=”Berenjena”;
$comidas[]=”Pimientos”;
Si un vector aún no ha sido creado y usamos la sintaxis anterior no pasa nada, el primer
elemento se introducirá en la posición 0, el siguiente en la 1 y así sucesivamente:
$grabadoras[]=”Lite-On”;
$grabadoras[]=”Sony”;
Página 11/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
$grabadoras[]=”Plextor”;
/* Puesto que grabadoras se acaba de crear y no contenía ningún elemento, Lite-On se añadiría en la
posición 0, Sony en la posición 1 y Plextor en la posición 2. Esta sintaxis puede ser muy útil si no
conocemos de antemano el número de elementos que vamos a insertar */
Asociativos
Los vectores asociativos son particularmente útiles cuando tiene más sentido acceder a un
vector usando palabras (claves) en vez de números enteros.
$nombre_vect[“clave”];
// ó
$nombre_vect[‘clave’];
$alumno[“nombre”]=”José”;
$alumno[“apellidos”]=”Martínez Roca”;
$alumno[“telefono”]=”963 616 654”;
$alumno[“direccion”]=”C/ Arco del triunfo 13”;
$alumno[“dni”]=”22 111 055”;
$alumno[“num_matricula”]=”6666”;
$alumno[“facultad”]=”Facultad Informática”;
$alumno[“curso”]=”5”;
/* Es importante comentar que si hiciésemos echo $alumno[0] el intérprete no daría error, pero no se
imprimiría nada en la pantalla. Es cierto que PHP trata de la misma forma los arrays asociativos y los
escalares, pero el usuario debe acceder convenientemente a cada uno de ellos. */
$alumno=array(
“nombre” => ”José”,
“apellidos” => ”Martínez Roca”,
“telefono” => “96 361 66 54”,
“direccion” => “C/ Arco del triunfo 13”,
“dni” => “22 111 055”,
“num_matricula” => “6666”,
“facultad” => “Facultad Informática”,
“curso” => “5” // El último no lleva una coma al final
);
Página 12/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
Muy importante:
Cuando se habló de cadenas se comentó que una de las diferencias entre comillas simples y dobles
residía en que la primera no expandía variables mientras que la segunda sí. Pues bien, si queremos
meter dentro de una cadena el valor de una posición de un vector, tenemos que meter la referencia al
vector entre llaves, tal como se indica en el ejemplo.
// Array Escalar
$vector[0]=”Australia”;
$vector[1]=”España”;
echo “El país que más me gusta es {$vector[0]}”;
echo “aunque yo he nacido en {$vector[1]}”;
// Array Asociativo
$alumno[“Nombre”]=”Vender”;
$alumno[“Tipo”]=”Robot”;
Esto afecta a todos los tipos de arrays: escalares y asociativos, ya sean unidimensionales o
multidimensionales.
ARRAYS MULTIDIMENSIONALES
Un vector de dimensión 2 se suele representar como una matriz. Para acceder a una celda
basta con suministrar la fila y la columna.
A partir de aquí, las representaciones se hacen cada vez más complicadas. Un vector de dimensión 4
podría representarse como un vector dónde cada posición contiene un cubo dividido en celdas.
Estructuras tan complejas no se suelen usar debido a lo difícil que puede llegar a ser su manejo.
Escalares
Tal y como uno se puede imaginar, la sintaxis general es la siguiente:
$nombre_vect[pos_dim_1][pos_dim_2]..[pos_dim_N]
Página 13/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
// Fila 0
$verdurita[0][0]=”Patata”;
$verdurita[0][1]=”Bonitato”;
// Fila 1
$verdurita[1][0]=”Lechuga”;
$verdurita[1][1]=”Pimientos”;
Asociativos
Funcionan exactamente igual que los escalares salvo que en vez de usar varios índices para
acceder a la información deseada, usamos varias palabras. Por ejemplo, si tenemos una tienda de
informática y vendemos procesadores y discos duros, es evidente que tendremos varias marcas y a
su vez cada marca tendrá varios modelos. Para simplificar, supondremos que sólo tenemos un
modelo de cada marca.
Procesadores:
AMD: K7 XP 1800
PENTIUM: IV 2,5 Ghz
Discos duros:
SEAGATE: 40GB 10000 rpm
SAMSUNG: 40GB 7200 rpm
WESTERN DIGITAL: 60GB 7200 rmp 8MB caché
Queremos almacenar esta estructura en un array multidimensional para que dado una marca
de procesador o de disco duro, podamos consultar el modelo disponible en stock:
// 1º los procesadores
$productos[“procesador”][“AMD”]=”K7 XP 1800”;
$productos[“procesador”][“PENTIUM”]=”IV 2,5 Ghz”;
)
);
// Si alguien nos pregunta qué disco duro SEAGATE tenemos, basta con hacer:
echo “Disco duro SEAGATE: {$productos[“disco_duro”][“SEAGATE”]}”;
También es posible mezclar arrays escalares y asociativos siendo una estrategia de lo más
útil. Para ver su utilidad ampliaremos el ejemplo anterior. Antes, por simplicidad, se supuso que sólo
teníamos un modelo de cada marca. Esto no suele ser cierto, lo normal es tener varios modelos de
una misma marca:
Procesadores:
AMD:
K7 XP 1900
K7 XP 1800
K7 XP 1700
PENTIUM:
IV 2,5 Ghz
IV 2,4 Ghz
IV 2,3 Ghz
IV 2,2 Ghz
Discos duros:
SEAGATE:
40GB 10000 rpm
80GB 7200 rpm
160GB 7200 rpm
SAMSUNG:
40GB 7200 rpm
WESTERN DIGITAL:
60GB 7200 rpm 8MB cache
80GB 1000 rpm 16MB cache
// 1º los procesadores
$productos[“procesador”][“AMD”][0]=”K7 XP 1900”;
$productos[“procesador”][“AMD”][1]=”K7 XP 1800”;
$productos[“procesador”][“AMD”][2]=”K7 XP 1700”;
Página 15/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
$productos[“procesador”][“AMD”][]=”K7 XP 2000”;
// Esto añadiría el nuevo procesador al final de los procesadores AMD, es decir, en la posición 3
// En cualquier momento si deseamos añadir una nueva marca (por ej. QUANTUM) basta hacer:
$productos[“disco_duro”][“QUANTUM”][0]”40GB 10000 rpm”;
/* Es conveniente comentar que no era necesarios indicar los índices. Ya se ha comentado que si se
usan los corchetes vacíos, PHP inserta el dato después de la última posición y si el vector no existía
metía el dato en la posición 0. Así, se podría haber hecho perfectamente: */
$productos[“procesador”][“AMD”][]=”K7 XP 1900”;
$productos[“procesador”][“AMD”][]=”K7 XP 1800”;
$productos[“procesador”][“AMD”][]=”K7 XP 1700”;
Es MUY importante que cuando deseemos acceder a una posición de un vector asociativo
escribamos CORRECTAMENTE la clave, es decir, que la escribamos exactamente como la definimos
al crear el vector. Pensemos que la clave no es más que una cadena de caracteres. Cuando nosotros
escribimos una clave, PHP compara el texto de la clave suministrada con las claves que contiene el
vector. La comparación se hace carácter a carácter. Eso significa que si ponemos un acento de más
(o de menos), o cambiamos una letra mayúscula por una minúscula, PHP no encontrará la clave que
estamos buscando.
Es también importante saber que PHP NO dará ningún tipo de error si escribimos mal la
clave. Si no encuentra la clave, supondrá que no existe y devolverá una cadena vacía.
$bebidas[“refrescantes”]=”Coca-Cola”;
$bebidas[“alcoholicas”]=”Ron”;
// Si hacemos
echo $bebidas[“refrescantes”]; // Daría por pantalla: Coca-Cola
echo $bebidas[“Refrescantes”]; /* No daría nada por pantalla pues PHP considera que la clave no
existe. */
Ya se ha dicho que la clave no es más que una cadena de caracteres. Sabemos que las
cadenas de caracteres pueden ir entre comillas simples o comillas dobles. Esto dota de gran
flexibilidad a la hora de crear claves pues el valor de una clave puede ser proporcionado por el valor
de una variable (para ello tenemos que encerrar la variable entre comillas dobles). Ello permite
incluso crear vectores con claves que ni siquiera sabemos a priori. Veamos un ejemplo:
$usuarios[“$marca”]=”K7 1800”;
// o bien
$usuarios[$marca]=”K7 1800”;
/* la segunda forma tiene más peligro puesto que si no estamos seguros de que la vble
$marca es una cadena de caracteres, podemos estar creando un vector escalar en vez
de uno asociativo y podemos tener problemas a la hora de acceder a los datos. Por lo
Página 16/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
PHP permite jugar enormemente con los vectores. Si queremos igualar un vector a otro, lo
único que tenemos que hacer es igualar la nueva variable al vector.
$piezas[0]=”monitor”;
$piezas[1]=”cpu”;
$piezas[2]=”placa base”;
$piezas[3]=”RAM”;
// Si queremos crear un nuevo vector llamado $mi_pc y que sea igual a $piezas basta hacer:
$mi_pc=$piezas;
// $mi_pc será una copia de $piezas.
// Imaginemos que queremos un vector dónde sólo tengamos los discos duros:
$discos_duros=$productos[“disco_duro”];
// Con esto conseguiríamos un vector bidimensional con los discos duros únicamente.
// Podemos acceder a uno de ellos sin más que hacer:
echo $discos_duros[“SEAGATE”][0];
$AMD=$productos[“procesadores”][“AMD”];
/* Con esto hemos creado un vector unidimensional con los modelos de procesador que tenemos de
AMD. Para acceder a uno de ellos basta hacer: */
echo $AMD[2];
Hay otro punto importante que debe ser tratado. PHP no dará error si se trata de acceder a
una posición del vector que no exista (al igual que si tratamos de acceder a una variable que no
existe o que aún no ha sido definida). Además, no tenemos por qué comenzar los vectores en la
posición 0. Es más, en un vector escalar, podemos ir metiendo datos en las posiciones 3, 5, 9, 12,
etc...(es decir, en posiciones totalmente arbitrarias) Pero ojo, las posiciones que se quedan vacías no
quedan rellenadas con nada, ni son inicializadas a 0, más bien todo lo contrario. Para PHP esas
posiciones no existen y de hecho si usamos la función count() para contar los elementos de un vector
sólo nos contará aquellas posiciones dónde hay datos. Un ejemplo seguro que aclara este asunto:
$prueba[2]=”dato1”;
$prueba[5]=”dato2”;
$prueba[6]=”dato3”;
$prueba[1024]=”dato4”;
$prueba[2220]=”dato5”;
// Si ahora hacemos
echo ‘El número de elementos del $prueba es: ’;
echo count($prueba);
Página 17/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
Hasta aquí hemos visto los diferentes tipos de vectores que hay, su construcción y el acceso
a los datos pero no hemos visto ni las estrategias de rellenado ni las formas de recorrer los vectores.
Esto se verá más adelante (una vez hallamos visto las estructuras de control) dentro de un tema
dedicado únicamente a vectores. Además se verán muchas de las funciones que PHP tiene para
realizar ordenaciones, búsquedas, eliminación de elementos, troceado de vectores, contabilidad de
los elementos de un vector, etc...
2.6.- Boolean
El tipo bolean sirve para representar, únicamente, dos estados CIERTO (TRUE) o FALSO
(FALSE). Ello permite utilizar variables como flags (indicadores, banderas). De esa forma podemos
hacer comprobaciones y dependiendo de si el indicador es cierto o no, hacer una cosa u otra.
PHP, al igual que C o Perl, también interpreta como CIERTO cualquier valor entero distinto de
0 y como FALSO el valor 0.
Esta dos formas de representar valores de verdad nos facilita las cosas y nos da más juego.
Veamos algunos ejemplos:
// -----------------------------------------------------------------------------------------
// Ejemplo 1
$flag_euros=TRUE;
Página 18/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
// Ejemplo 5
$flag_euros=1;
2.7.- Objetos
PHP permite también la programación orientada a objetos. Podemos considerar un objeto
como una variable que ha sido instanciada a partir de un tipo de plantilla (clase). Esto se sale fuera
del propósito de este manual y por tanto sólo se verán algunos conceptos generales.
Una clase es una colección de variables y de funciones que acceden a esas variables. Una
clase se define con la siguiente sintaxis:
<?php
class Cart {
var $items; // Items en nuestro carro de la compra
El ejemplo define una clase llamada Cart que consiste en un array asociativo de artículos en
el carro y dos funciones para meter y sacar ítems del carro. Las clases son tipos, es decir, son
plantillas para variables. Tienes que crear una variable del tipo deseado con el operador new.
Este ejemplo crea un objeto $cart de clase Cart. La función add_item() de ese objeto se llama
para añadir un item del artículo número 10 al carro.
Las Clases pueden ser extensiones de otras clases. Las clases extendidas o derivadas tienen todas
las variables y funciones de la clase base y lo que les añadas al extender la definición. La herencia
múltiple no está soportada.
Página 19/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
Ese ejemplo define una clase Named_Cart (carro con nombre o dueño) que tiene todas las
variables y funciones de Cart, y además añade la variable $owner y una función adicional
set_owner(). Un carro con nombre se crea de la forma habitual y, una vez hecho, puedes acceder al
propietario del carro. En los carros con nombre también puedes acceder a las funciones normales del
carro:
Entre funciones de una clase, la variable $this hace referencia al propio objeto. Tienes que
usar $this->loquesea para acceder a una variable o función llamada loquesea del objeto actual.
Los constructores son funciones de una clase que se llaman automáticamente al crear una nueva
instancia (objeto) de una clase. Una función se convierte en constructor cuando tiene el mismo
nombre que la clase.
Este ejemplo define una clase Auto_Cart que es un Cart junto con un constructor que
inicializa el carro con un item del tipo de artículo "10" cada vez que se crea un nuevo Auto_Cart con
"new". Los constructores también pueden recibir parámetros y estos parámetros pueden ser
opcionales, lo que los hace más útiles.
Atención: Para las clases derivadas, el constructor de la clase padre no es llamado automáticamente
cuando se llama al constructor de la clase derivada.
Página 20/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
2.8.- Identificadores
Un identificador es un término general aplicado a las variables, funciones y objetos
definidos por el usuario. Hay diversas propiedades que han de cumplir los identificadores en PHP:
o Un identificador consiste en uno más caracteres y debe comenzar con una letra del
abecedario o un carácter de subrayado (“_”). Además, los identificadores sólo pueden estar
constituidos por letras, números caracteres de subrayado y otros caracteres ASCII
comprendidos del 127 a 255.
o Los identificadores son sensibles a mayúsculas y minúsculas. Por lo tanto, una variable
llamada $nombre es diferente a otra llamada $Nombre, $nombrE ó $NoMbRe.
o Por último, un identificador no puede ser idéntico a ninguna de las palabras clave predefinidas
en PHP.
2.9.- Variables
Hasta ahora hemos venido jugando con las variables de una forma relativamente sencilla. En
realidad no hemos hecho más que asignaciones y acceso a los contenidos de las variables. El
propósito de este punto es el de entrar en detalle sobre el maravilloso mundo de la manipulación de
variables.
o Variables Locales
o Variables Globales
o Variables Estáticas
Variables Locales
Una variable declarada dentro de una función es considerada como local, es decir, sólo
puede ser referenciada dentro de la función. Cualquier asignación fuera de la función será
considerada como la asignación de un valor a una variable totalmente diferente a la contenida dentro
de la función (aunque tengan el mismo nombre). Es importante saber que cuando finaliza una
función, todas las variables locales contenidas en ella son destruidas.
<?php
$x=0;
function asigna_x()
{
Página 21/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
$x=5;
echo “\$x dentro de la función vale: $x <br>”;
}
Variables Globales
A diferencia de las variables locales, una variable Global puede ser accedida y modificada
desde cualquier parte del programa. Sin embargo, para llevar esto a efecto, una variable global debe
ser explícitamente declarada como tal dentro de la función. Esto se consigue colocando la palabra
reservada GLOBAL delante de la variable que debe ser reconocida como tal. Veamos un ejemplo:
<?php
$var=25;
function incrementa_var()
{
GLOBAL $var;
$var++;
}
incrementa_var();
echo $var; // Esto dará como resultado: 26
?>
La sintaxis anterior puede dar lugar a confusión. En funciones extremadamente largas, puede
llegar a ocurrir que olvidemos que la variable $var es global y no local. Para evitar este tipo de
problemas, PHP proporciona un tipo de sintaxis alternativa que consiste en usar su vector de
variables globales llamado $GLOBALS. La sintaxis es:
$GLOBALS[“nombre_var_global”];
o
$GLOBALS[‘nombre_var_global’];
<?php
$var=25;
function incrementa_var()
{
$GLOBALS[‘var’]++;
}
incrementa_var();
echo $var; // Esto dará como resultado: 26
Página 22/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
// Dentro del programa principal también podemos acceder a la variable $var usando el vector
// $GLOBALS. Es poco útil, pero totalmente válido:
También podemos crear variables globales dentro de las funciones usando cualquiera de los
dos métodos anteriores:
<?php <?php
Es evidente que ambos ejemplos son válidos y darán por salida los mismos resultados.
También se podía haber usado en ambos casos echo $GLOBALS[‘var’]; en vez de echo $var;
dentro del programa principal.
Sólo queda comentar que aunque el uso de variables globales puede ser bastante útil,
siempre han sido una fuente de interminables problemas para los programadores. Por lo tanto, se
recomienda un uso prudente de las mismas.
Variables Estáticas
En pocas palabras, una variable estática es una es una especie variable local que no es
destruida cuando finaliza la función y que por tanto mantiene su valor. De esa forma si volvemos a
llamar a la función, dicha variable tendrá el valor mantenido. Para declarar una variable estática, sólo
tenemos que poner la palabra reservada STATIC delante del nombre de la variable e inicializarla al
valor que queremos que tenga inicialmente (valga la redundancia). Un ejemplo seguro que aclara su
uso:
<?php
function inc_contador()
{
STATIC $count = 0;
$count++;
echo $count;
}
inc_contador(); // Imprimirá 1
inc_contador(); // Imprimirá 2
inc_contador(); // Imprimirá 3
?>
Página 23/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
Si quisiese probar cualquiera de los ejemplos de esta sección, puede cortar y pegar los
ejemplos e insertar la siguiente línea para ver por sí mismo lo que va ocurriendo:
Si los últimos dos ejemplos anteriores parecen confusos, ver Conversión de cadenas.
Dado que PHP determina los tipos de las variables y los convierte (generalmente) según
necesita, no siempre resulta obvio de qué tipo es una variable dada en un momento concreto. PHP
incluye varias funciones que descubren de qué tipo es una variable. Son gettype(), is_long(),
is_double(), is_string(), is_array(), y is_object().
Si se desea obligar a que una variable sea evaluada con un tipo concreto, hay que hacer un
Forzado de tipos (que se verá a continuación). Si se desea cambiar el tipo de una variable, se puede
usar la función settype().
$a = 1; // $a es un entero
$a[0] = "f"; // ¿ $a se convierte en un array, en el que $a[0] vale "f" ?
Aunque el ejemplo anterior puede parecer que claramente debería resultar en que $a se
convierta en un array dónde el primer elemento es 'f', consideremos esto:
Dado que PHP soporta indexación en las cadenas mediante desplazamientos usando la
misma sintaxis que la indexación de arrays, el ejemplo anterior nos conduce a un problema: ¿debería
convertirse $a en un array cuyo primer elemento sea "f", o debería convertirse "f" en el primer carácter
de la cadena $a?
Por esta razón, tanto en PHP 3.0.12 como en PHP 4.0b3-RC4, el resultado de esta conversión
automática se considera que no está definido. Los parches se están discutiendo.
Por lo visto, si se desea reutilizar una variable para estos propósitos, se puede usar la función
unset() que se encarga de destruir la variable. Una vez destruida la podemos volver a crear
asignándole el valor que mejor nos convenga.
Página 24/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
El forzado de tipos en PHP funciona como en C: el nombre del tipo deseado se escribe entre
paréntesis antes de la variable a la que se pretende forzar.
Nótese que las tabulaciones y espacios se permiten dentro de los paréntesis, así que los siguientes
ejemplos son funcionalmente equivalentes:
$var = 14.7;
$var = ( int ) var; // $var ahora valdrá 14
Puede no ser obvio que ocurrirá cuando se fuerce entre ciertos tipos. Por ejemplo, lo
siguiente debería ser tenido en cuenta. Cuando se fuerza el cambio de un escalar o una variable de
cadena a un array, la variable se convertirá en el primer elemento del array:
$var = 'ciao';
$arr = (array) $var;
echo $arr[0]; // produce la salida 'ciao'
Cuando se fuerza el tipo de una variable escalar o de una cadena a un objeto, la variable se
convertirá en un atributo del objeto; el nombre del atributo será 'scalar':
$var = 'ciao';
$obj = (object) $var;
echo $obj->scalar; // produce la salida 'ciao'
En PHP, las variables siempre se asignan por valor. Esto significa que cuando se asigna una
expresión a una variable, el valor íntegro de la expresión original se copia en la variable de destino.
Esto quiere decir que, por ejemplo, después e asignar el valor de una variable a otra, los cambios que
se efectúen a una de esas variables no afectará a la otra
1
PHP ofrece, además, 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") la variable original. Los cambios a la nueva variable afectan a la original, y
1
PHP3 no permite este tipo de asignación. Esta novedad está incluida a partir de la versión 4.
Página 25/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
viceversa. Esto también significa que no se produce una copia de valores; por tanto, la asignación
ocurre más rápidamente. De todos modos, cualquier incremento de velocidad se notará sólo en los
bucles críticos cuando se asignen grandes arrays u objetos.
Para asignar por referencia, simplemente se antepone un ampersand (&) al comienzo de la variable
cuyo valor se está asignando (la variable fuente).
<?php
$postre = 'Tárta de arándanos'; // Asigna el valor 'Tárta de arándanos' a $postre
$p_postre = &$postre; // $p_postre es un puntero a la variable $postre.
echo "Mi postre preferido es: $postre"; // Daría por salida: Mi postre preferido es: Tárta de arándanos
$p_postre = ‘Tarta de queso’; // Cambiamos nuestro postre preferido
echo "Mi postre preferido es: $postre"; // Ahora la salida será: Mi postre preferido es: Tárta de queso
?>
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 una expresión sin nombre.
function test() {
return 25;
}
VARIABLES VARIABLES
A veces es conveniente tener nombres de variables variables. Dicho de otro modo, son
nombres de variables que se pueden establecer y usar dinámicamente. Una variable normal se
establece con una sentencia como:
$a = "hola";
Una variable variable toma el valor de una variable y lo trata como el nombre de una variable.
En el ejemplo anterior, hola, se puede usar como el nombre de una variable utilizando dos signos de
dólar. p.ej.
$$a = "mundo";
Para usar variables variables con arrays, hay que resolver un problema de ambigüedad. Si se
escribe $$a[1] el intérprete necesita saber si nos referimos a utilizar $a[1] como una variable, o si se
pretendía utilizar $$a como variable y el índice [1] como índice de dicha variable. La sintaxis para
Página 26/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
resolver esta ambiguedad es: ${$a[1]} para el primer caso y ${$a}[1] para el segundo. Veamos un
ejemplo:
<?php
// Si ahora hacemos:
${$a[0]}=’frankfurt’;
/* Primero resolvemos lo que está entre llaves y luego se resuelve el resto. Es decir, creamos una
nueva variable de nombre el valor de la posición 0 y cuyo contenido es frankfurt. Lo de arriba es
equivalente a hacer: $salchichas = ‘frankfurt’; */
/* Algo bastante raro y que no conviene hacer. {$a[0]} devuelve el valor de la posición 0 del vector $a
pero {$a} devuelve el tipo de la variable $a y que es Array. Por tanto creamos una nueva variable de
nombre Array (de tipo vector porque hemos puesto [0]) y en cuya posición 0 metemos la cadena
bradburst. Es decir, es como si hiciéramos directamente: $Array[0] = ‘bradburst’; */
?>
CONSTANTES
Se puede definir una constante usando la función define(). Una vez definida, no puede ser
modificada ni eliminada.
Solo se puede definir como constantes valores escalares (boolean, integer, float y string ).
Para obtener el valor de una constante solo es necesario especificar su nombre. A diferencia de las
variables, no se tiene que especificar el prefijo $. También se puede utilizar la función constant() para
obtener el valor de una constante. Podemos usar la función get_defined_constants() parar obtener
array asociativo con el nombre de todas las constantes y sus respectivos valores.
Nota: Las constantes y las variables (globales) se encuentran en un espacio de nombres distinto.
Esto implica que por ejemplo TRUE y $TRUE son diferentes.
Aunque se pude definir constantes en cualquier parte del código, es conveniente hacerlo al principio
del script para evitar problemas. Para poder usar un constante, previamente tiene que haver sido
declarada como tal. Si uno no se da cuenta y define la función más debajo de dónde la usa, el
intérprete considerará que la constante referencia no existe pudiendo dar lugar a resultados no
deseados. Usar la función defined() para comprobar la existencia de dicha constante.
Página 27/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
<?php
define("PI", "3.141592");
echo PI; // Da como salida: 3.141592
?>
VARIABLES PREDEFINIDAS
PHP proporciona una gran cantidad de variables predefinidas a cualquier script que se
ejecute. De todas formas, muchas de esas variables no pueden estar completamente documentadas
ya que dependen de sobre qué servidor se esté ejecutando, la versión y configuración de dicho
servidor, y otros factores. Algunas de estas variables no estarán disponibles cuando se ejecute PHP
desde la línea de comandos.
Las siguientes variables son creadas por el propio PHP (a partir de PHP 4.1.0). Son
denominadas superglobales porque se puede acceder a ellas desde cualquier parte del código del
programa, da igual que estemos dentro de una función o dentro del método de un objeto.
$GLOBALS
Contiene una referencia a cada variable disponible en el espectro de las variables del script. Las
claves de esta matriz son los nombres de las variables globales. $GLOBALS existe desde PHP 3.
$_SERVER
Variables definidas por el servidor web ó directamente relacionadas con el entorno en donde el script
se esta ejecutando. Análoga a la antigua matriz $HTTP_SERVER_VARS (la cual está todavía
disponible, aunque no se use).
$_GET
Variables proporcionadas al script por medio de HTTP GET. Análoga a la antigua matriz
$HTTP_GET_VARS (la cual está todavía disponible, aunque no se use).
$_POST
Variables proporcionadas al script por medio de HTTP POST. Análoga a la antigua matriz
$HTTP_POST_VARS (la cual está todavía disponible, aunque no se use).
$_COOKIE
Variables proporcionadas al script por medio de HTTP cookies. Análoga a la antigua matriz
$HTTP_COOKIE_VARS (la cual está todavía disponible, aunque no se use).
$_FILES
Variables proporcionadas al script por medio de la subida de ficheros via HTTP . Análoga a la antigua
matriz $HTTP_POST_FILES (la cual está todavía disponible, aunque no se use). Vea también
Subiendo ficheros por método POST para más información.
$_ENV
Variables proporcionadas al script por medio del entorno. Análoga a la antigua matriz
$HTTP_ENV_VARS (la cual está todavía disponible, aunque no se use).
$_REQUEST
Variables proporcionadas al script por medio de cuaquier mecanismo de entrada del usuario y por lo
tanto no se puede confiar en ellas. La presencia y el orden en que aparecen las variables en esta
matriz es definido por la directiva de configuración variables_order. Esta matriz no tiene un análogo
en versiones anteriores a PHP 4.1.0. Ver también import_request_variables().
Nota: Cuando se utiliza la linea de comandos aparecerán dos nuevas variables globales llamadas
$argv y $argc.
$_SESSION
Variables registradas en la sesión del script. Análoga a la antigua matriz $HTTP_SESSION_VARS (la
cual está todavía disponible, aunque no se use).
Las antiguas matrices $HTTP_*_VARS siguen existiendo pero tienen un comportamiento
distinto. No son superglobales y por tanto, si se quiere acceder a ellas desde una función o un
Página 28/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
Si se desea ver una lista completa de las variables del servidor, del entorno y de PHP basta hacer:
Saldrá algo como esto (Realizado sobre un servidor Apache en Windows XP):
Página 29/115
Iniciación a PHP 4 2.- TIPOS DE DATOS Y VARIABLES
SERVER_SIGNATURE =>
Apache/1.3.27 Server at localhost Port 80
Nota: Las variables en negrita, son variables que ha creado el propio script.
Página 30/115
Iniciación a PHP 4 3.- OPERADORES Y ESTRUCTURAS DE CONTROL
3.1.- Expresiones
Una expresión es, básicamente, a un línea de código representando una acción en un
programa. Todas las expresiones constan de al menos un operando y uno o más operadores.
OPERANDOS
$a++; // $a es un operando
$sum = $valor1 + $valor2 // $sum, $valor1 y $valor2 son operandos
OPERADORES
Un operador es un símbolo que especifica una acción en una expresión. Muchos de los
operadores que se verán son sencillos y pueden resultar familiares. Es importante comentar que la
conversión automática de tipos que PHP posee, convertirá los tipos de los operandos según el tipo de
operador utilizado.
$a++; // ++ es un operador
$sum = $valor1 + $valor2 // = y + son operadores
3.2.- Operadores
PRECEDENCIA DE OPERADORES
Asociatividad Operadores
izquierda ,
izquierda or
izquierda xor
izquierda and
derecha print
izquierda = += -= *= /= .= %= &= |= ^= ~= <<= >>=
izquierda ?:
izquierda ||
izquierda &&
izquierda |
izquierda ^
izquierda &
Página 31/115
Iniciación a PHP 4 3.- OPERADORES Y ESTRUCTURAS DE CONTROL
no asociativo == != ===
no asociativo < <= > >=
izquierda << >>
izquierda +-.
izquierda */%
derecha ! ~ ++ -- (int) (double) (string) (array) (object) @
derecha [
no asociativo new
no asociativo ()
La asociatividad de un operador indica en qué orden son evaluados las operaciones con el
mismo grado de precedencia. La asociatividad puede ser realizada en dos direcciones de izquierda a
derecha o de derecha a izquierda.
OPERADORES ARITMÉTICOS
Son los operadores más sencillos y más comunes. Suelen ser usados bastante dentro de
cualquier programa.
o El operador Módulo sólo tiene sentido si ambos operandos son números enteros pues, a fin
de cuentas, devuelve el resto de la división entera. Por tanto el tipo del resultado también
será un entero.
o El operador división puede funcionar de dos formas dependiendo del tipo de los operandos.
Si los dos operandos son números enteros, entonces dará por resultado el cociente de la
división entera (es decir, sin decimales) y por tanto el resultado también será un número
entero. En cambio, si alguno de los dos operandos en un número en coma flotante, el
resultado es la división entre números reales y devolverá un real (es decir, un número con
decimales).
OPERADORES DE ASIGNACIÓN
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 curiosas como:
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 te 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.
Página 32/115
Iniciación a PHP 4 3.- OPERADORES Y ESTRUCTURAS DE CONTROL
$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í!";
Fíjate en 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.
OPERADORES DE INCREMENTO/DECREMENTO
<?php
echo "<h3>Postincremento</h3>";
$a = 5;
echo "Debería ser 5: " . $a++ . "<br>\n";
echo "Debería ser 6: " . $a . "<br>\n";
echo "<h3>Preincremento</h3>";
$a = 5;
echo "Debería ser 6: " . ++$a . "<br>\n";
echo "Debería ser 6: " . $a . "<br>\n";
echo "<h3>Postdecremento</h3>";
$a = 5;
echo "Debería ser 5: " . $a-- . "<br>\n";
echo "Debería ser 4: " . $a . "<br>\n";
echo "<h3>Predecremento</h3>";
$a = 5;
echo "Debería ser 4: " . --$a . "<br>\n";
echo "Debería ser 4: " . $a . "<br>\n";
?>
OPERADORES LÓGICOS
Al igual que los operadores aritméticos, los operadores lógicos ocupan un gran protagonismo
dentro de cualquier aplicación pues proporcionan un método para la toma de decisiones basado en el
cumplimiento o no de ciertas condiciones.
Página 33/115
Iniciación a PHP 4 3.- OPERADORES Y ESTRUCTURAS DE CONTROL
La razón de las dos variaciones de "y" y "o" es que operan con distinta precedencia (ver
Precedencia de Operadores.)
OPERADORES DE COMPARACIÓN
Los operadores de comparación, como su nombre indica, permiten comparar dos valores.
Operadores de Comparación
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 condicional es el operador "?:" (o ternario), que funciona como en C y otros muchos
lenguajes.
La expresión toma el valor expr2 si expr1 se evalúa a cierto, y expr3 si expr1 se evalúa a falso.
Los operadores bit a bit te permiten activar o desactivar bits individuales de un entero.
OPERADOR DE EJECUCIÓN
PHP soporta un operador de ejecución: el apóstrofe invertido (``). ¡Fíjate que no son
apostrofes normales! PHP intentará ejecutar la instrucción contenida dentro de los apóstrofes
invertidos como si fuera un comando del shell; y su salida devuelta como el valor de esta expresión
(es decir, no tiene por qué ser simplemente volcada como salida, puede asignarse a una variable).
Página 34/115
Iniciación a PHP 4 3.- OPERADORES Y ESTRUCTURAS DE CONTROL
OPERADORES DE CADENAS
$a = "Hola ";
$b = $a . "Mundo!"; // ahora $b contiene "Hola Mundo!"
$a = "Hola ";
$a .= "Mundo!"; // ahora $a contiene "Hola Mundo!"
if
if (expr)
sentencia
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 en un grupo de 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:
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 condicion, y una
sentencia distinta si la condición no se cumple. Esto es para lo que sirve else. La sentencia else se
Página 35/115
Iniciación a PHP 4 3.- OPERADORES Y ESTRUCTURAS DE CONTROL
ejecuta solamente si la expresión if se evalúa como FALSE.. 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:
elseif
elseif, como su nombre 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 se evalúe
como FALSE. No obstante, a diferencia de else, ejecutará esa 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:
Pueden haber varios elseif’s dentro de la misma sentencia if. La primera expresión elseif (si
hay alguna) que se evalúe como TRUE 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).
PHP ofrece una sintaxis alternativa para alguna de sus estructuras de control; a saber, if,
while, for, y switch. En cada caso, la forma básica de la sintaxis alternativa es cambiar abrir-llave por
dos puntos (:) y cerrar-llave por endif;, endwhile;, endfor;, or endswitch;, respectivamente.
En el ejemplo de arriba, el bloque HTML "A = 5" se anida dentro de una sentencia if escrita
en la sintaxis alternativa. El bloque HTML se mostraría solamente si $a fuera igual a 5.
La sintaxis alternativa se aplica a else y también a elseif. La siguiente es una estructura if con elseif
y else en el formato alternativo:
if ($a == 5):
print "a es igual a 5";
print "...";
elseif ($a == 6):
print "a es igual a 6";
print "!!!";
else:
print "a no es ni 5 ni 6";
endif;
Página 36/115
Iniciación a PHP 4 3.- OPERADORES Y ESTRUCTURAS DE CONTROL
while
Los bucles while son los tipos de bucle más simples en PHP. Se comportan como su como
en C. La forma básica de una sentencia while es:
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 TRUE. El valor de la
expresión es comprobado cada vez al principio del bucle, 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 bucle es una iteración). Puede ocurrir que la expresión
while se evalúe como FALSE desde el principio del todo, en ese caso la(s) sentencia(s) anidada(s)
no se ejecutarán ni siquiera una vez.
Como con la sentencia if, se pueden agrupar múltiples sentencias dentro del mismo bucle
while encerrando un grupo de sentencias con llaves, o usando la sintaxis alternativa:
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;
do..while
Los bucles do..while son muy similares a los bucles while, excepto que las condiciones se
comprueban al final de cada iteración en vez de al principio. La principal diferencia frente a los bucles
regulares while es que se garantiza la ejecución de la primera iteración de un bucle do..while (la
condición se comprueba sólo al final de la iteración), mientras que puede no ser necesariamente
ejecutada con un bucle while regular (la condición se comprueba al principio de cada iteración, si
esta se evalúa como FALSE desde el principio la ejecución del bucle finalizará inmediatamente).
$i = 0;
do {
print $i;
} while ($i>0);
El bucle 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 FALSE ($i no es más grande que 0) y la
ejecución del bucle finaliza.
Página 37/115
Iniciación a PHP 4 3.- OPERADORES Y ESTRUCTURAS DE CONTROL
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, encapsulándolos con
do..while(0), y usando la sentencia break. El siguiente fragmento de código demuestra esto:
do {
if ($i < 5) {
print "i no es lo suficientemente grande";
break;
}
$i *= $factor;
if ($i < $limite_minimo) {
break;
}
print "i es correcto";
...procesa i...
} while(0);
for
Los bucles for son los bucles más complejos en PHP. Se comportan como en C. La sintaxis
de un bucle for es:
La primera expresión (expr1) se evalúa (ejecuta) incondicionalmente una vez al principio del
bucle. Al comienzo de cada iteración, se evalúa expr2. Si se evalúa como TRUE, el bucle continúa y
las sentencias anidadas se ejecutan. Si se evalúa como FALSE, la ejecución del bucle finaliza.
Al final de cada iteración, se evalúa (ejecuta) expr3.
Cada una de las expresiones puede estar vacía. Que expr2 esté vacía significa que el bucle debería
correr indefinidamente (PHP implícitamente lo considera como TRUE, 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 bucle usando una
sentencia break condicional en vez de usar la condición de for.
Considera los siguientes ejemplos. Todos ellos muestran números del 1 al 10:
/* ejemplo 1 */
/* ejemplo 2 */
/* ejemplo 3 */
$i = 1;
for (;;) {
if ($i > 10) {
break;
}
print $i;
$i++;
}
Página 38/115
Iniciación a PHP 4 3.- OPERADORES Y ESTRUCTURAS DE CONTROL
/* ejemplo 4 */
Por supuesto, el primer ejemplo parece ser el mas elegante (o quizás el cuarto), pero uno
puede descubrir que ser capaz de usar expresiones vacías en bucles for resulta útil en muchas
ocasiones.
PHP también soporta la "sintaxis de dos puntos" alternativa para bucles for.
foreach
PHP4 (PHP3 no) incluye una construcción foreach, tal como perl y algunos otros lenguajes.
Esto simplemente da un modo fácil de iterar sobre arrays. Hay dos sintaxis; la segunda es una
extensión menor, pero útil de la primera:
LA VEREMOS CON MÁS DETALLE EN EL TEMA DE VECTORES JUNTO CON LA FUNCIÓN LIST
Y EACH
La primera forma recorre el array dado por nombre_array. En cada iteración, el valor del
elemento actual se asigna a $value y el puntero interno del array se avanza en una unidad (así en el
siguiente paso, se estará mirando el elemento siguiente).
La segunda manera hace lo mismo, salvo que la clave del elemento actual será asignada a la
variable $key en cada iteración.
Nota: Cuando foreach comienza su primera ejecución, el puntero interno a la lista (array) se reinicia
automáticamente al primer elemento del array. Esto significa que no se necesita llamar a reset()
antes de un bucle foreach.
Nota: Hay que tener en cuenta que foreach funciona con una copia de la lista (array) especificada y
no la lista en si, por ello el puntero de la lista no es modificado como en la construcción each.
reset( $arr );
while( list(,$value ) = each( $arr ) ) {
echo "Valor: $value<br>\n";
}
reset( $arr );
while( list( $key, $value ) = each( $arr ) ) {
echo "Key: $key; Valor: $value<br>\n";
}
foreach($a as $v) {
print "Valor actual de \$a: $v.\n";
}
foreach($a as $v) {
print "\$a[$i] => $k.\n";
}
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";
Página 40/115
Iniciación a PHP 4 3.- OPERADORES Y ESTRUCTURAS DE CONTROL
break;
}
Es importante entender cómo se ejecuta la sentencia switch para evitar errores. La sentencia
switch 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 PHP comienza a ejecutar las sentencias. PHP continúa ejecutando las sentencias hasta el
final del bloque switch, o la primera vez que vea una sentencia break. Si no se escribe 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 sentecias 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 intencionadamente en ciertas circunstancias).
En una sentencia switch, la condición se evalúa sólo una vez y el resultado se compara a
cada sentencia case. En una sentencia elseif, la condición se evalúa otra vez. Si tu condición es más
complicada que una comparación simple y/o está en un bucle estrecho, un switch puede ser más
rápido.
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 case especial es el default case. Este case coincide con todo lo que no coincidan 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";
}
Página 41/115
Iniciación a PHP 4 3.- OPERADORES Y ESTRUCTURAS DE CONTROL
La expresión case puede ser cualquier expresión que se evalúe a un tipo simple, es decir,
números enteros o de punto flotante y cadenas de texto. No se pueden usar aquí ni arrays ni objetos
a menos que se conviertan a un tipo simple.
La sintaxis alternativa para las estructuras de control está también soportada con 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;
break
break escapa de la estructuras de control iterantes (bucles) actuales: for, while, do..while, o
switch. break accepta un parámetro opcional, el cual determina cuantas estructuras de control hay
que escapar.
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "Estamos en \$i=5 <br>\n";
break 1; /* Salir solo del switch. */
case 10:
echo "Estamos en \$i=10; saliéndonos <br>\n";
break 2; /* Salir del switch y del while. */
default:
break;
}
}
continue
continue se usa dentro de la estructura del bucle para saltar el resto de la iteración actual del
bucle y continuar la ejecución al comienzo de la siguiente iteración. continue acepta un parámetro
opcional, el cual determina cuantos niveles (bucles) hay que saltar antes de continuar con la
ejecución.
Página 42/115
Iniciación a PHP 4 3.- OPERADORES Y ESTRUCTURAS DE CONTROL
$i = 0;
while ($i++ < 5)
{
echo "Fuera<br>\n";
while (1)
{
echo "-Medio<br>\n";
while (1)
{
echo "--Dentro<br>\n";
continue 3;
}
echo "Ésto nunca saldrá.<br>\n";
}
echo "Ni tampoco ésto.<br>\n";
}
Página 43/115
Iniciación a PHP 4 4.- FUNCIONES
4.- FUNCIONES
El nombre de una función debe seguir las reglas descritas en el capítulo 2 respecto a los
identificadores.
Debido a la flexibilidad de PHP respecto a que no es necesario definir los tipos de las
variables, tampoco es necesario especificar el tipo de los argumentos que son pasados a una función.
Es cierto que esto tiene sus ventajas, pero hay que tener en cuenta que el motor de PHP no hará
comprobaciones para saber si la función podrá manejar los tipos de datos que se le han pasado,
pudiendo llevar a resultados inesperados.
o Cualquier instrucción válida de PHP puede aparecer en el cuerpo de la función, incluso otras
funciones y definiciones de clases.
o En PHP3, las funciones deben definirse antes de que se referencien. En PHP4 no existe tal
requerimiento.
o PHP no soporta la sobrecarga de funciones, y tampoco es posible redefinir u ocultar
funciones previamente declaradas.
o PHP3 no soporta un número variable de parámetros, aunque sí soporta parámetros por
defecto. PHP4 soporta ambos y las referencias de las funciones func_num_args(),
func_get_arg(), y func_get_args() (Todo esto se verá más adelante).
Página 44/115
Iniciación a PHP 4 4.- FUNCIONES
Aunque las funciones anidadas no están protegidas y pueden ser utilizadas desde cualquier
punto del programa, no pueden ser llamadas hasta que su función padre haya sido llamada.
<?php
function pie()
{
function copyright($nombre,$ano,$correo)
{
echo "<br><a href='mailto:$correo'>$nombre $ano</a><br>";
}
$alineamiento_ini="<center>";
$alineamiento_fin="</center>";
$home="<a href='home.php'>Inicio</a>";
$links="<a href='enlaces.php'>Enlaces</a>";
$contact="<a href='contacta.php'>Contacta con nosotros</a>";
echo <<<HTML
$alineamiento_ini\n
$home | $links | $contact\n
$alineamiento_fin\n
HTML;
echo "$alineamiento_ini";
copyright("Gabriel Merín","2002","gabmecu@inf.upv.es");
echo "$alineamiento_fin";
}
<?php
function fact_recur($num)
{
// Cálculo del factorial de forma recursiva
if ($num==0) return 1;
Página 45/115
Iniciación a PHP 4 4.- FUNCIONES
function fact_iter($num)
{
// Cálculo del factorial de forma iterativa
$result=1;
for($i=$num; $i>0; $i--) $result*=$i;
return $result;
}
?>
Como se puede observar, la forma recursiva suele ser mucho sencilla de implementar. Sólo
es necesario fijar un caso base e ir haciendo llamadas recursivas hasta alcanzar el caso base. La
forma iterativa (sencilla en este caso) suele ser más complicada de implementar y con bastantes más
líneas de código. Pese a que suele ser más deseable usar algoritmos iterativos por un tema de
eficiencia computacional, algunos algoritmos requieren una implementación recursiva debido a la alta
complejidad que puede resultar la implementación iterativa.
function toma_array($input) {
echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
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 deseas permitir a una
función modificar sus parámetros, debes pasarlos por referencia.
Si quieres que un parámetro de una función siempre se pase por referencia, puedes
anteponer un ampersand (&) al nombre del parámetro en la definición de la función:
function pon_mas_texto(&$string) {
$string .= ' y algo más.';
}
$str = 'Esto es una cadena, ';
pon_mas_texto($str);
echo $str; // Saca 'Esto es una cadena, y algo más.'
Si deseas pasar una variable por referencia a una función que no toma el parámetro por
referencia por defecto, puedes anteponer un ampersand al nombre del parámetro en la llamada a la
función:
Página 46/115
Iniciación a PHP 4 4.- FUNCIONES
Una función puede definir valores por defecto para los parámetros escalares estilo C++:
El valor por defecto tiene que ser una expresión constante, y no una variable o miembro de
una clase.
Destacar que cuando se usan parámetros por defecto, estos tienen que estar a la derecha de
cualquier parámetro sin valor por defecto; de otra manera las cosas no funcionarán de la forma
esperada. Considera el siguiente fragmento de código:
Página 47/115
Iniciación a PHP 4 4.- FUNCIONES
PHP4 soporta las listas de longitud variable de parámetros en las funciones definidas por el
usuario. Es realmente fácil, usando las funciones func_num_args(), func_get_arg(), y
func_get_args(). No necesita de ninguna sintaxis especial, y las listas de parámetros pueden ser
escritas en la llamada a la función y se comportarán de la manera esperada.
func_num_args
(PHP 4 )
func_num_args -- Devuelve el número de argumentos pasados a la función.
Descripción:
<?php
function print_num_args() {
$numargs = func_num_args();
echo "Número de argumentos: $numargs\n";
}
print_num_args( 1, 2, 3 ); // Saca por pantalla 'Número de argumentos: 3'
?>
func_get_arg
(PHP 4 )
Descripción:
Devuelve el argumento que está en la posición arg_num en la lista de argumentos de una función
definida por el usuario. Los argumentos de la función se cuentan comenzando por la posición cero.
func_get_arg() generará un aviso si se llama desde fuera de la definición de la función.
Si arg_num es mayor que el número de argumentos pasados realmente, se generará un aviso y
func_get_arg() devolverá FALSE.
<?php
function print_args() {
$numargs = func_num_args();
for ($i=0; $i<$numargs; $i++) echo “Argumento $I: “,func_get_arg($i),”<br>\n”;
}
print_args( 1, 2, 3 ); // Saca por pantalla 'Número de argumentos: 3'
?>
func_get_args
(PHP 4 )
Descripción:
Página 48/115
Iniciación a PHP 4 4.- FUNCIONES
<?php
function get_args() {
$numargs = func_num_args();
$arg_list = func_get_args();
for ( $i = 0; $i < $numargs; $i++ ) {
echo "El argumento $i vale: " . $arg_list[$i] . "<br>\n";
}
}
foo( 1, 2, 3 );
DEVOLVER VALORES
Los valores se retornan usando la instrucción opcional return. Puede devolverse cualquier
tipo de valor, incluyendo listas y objetos.
No puedes devolver múltiples valores desde una función, pero un efecto similar se puede
conseguir devolviendo una lista.
function numeros() {
return array (0, 1, 2);
}
list ($cero, $uno, $dos) = numeros();
Aunque puede resultar más cómodo quedarnos con el vector (pudiera ser que no supiéramos
cuántos elementos nos va a devolver la función):
function numeros() {
return array (0, 1, 2);
}
$vect = numeros();
<?php
function nada() {
echo "Estamos dentro de la función nada()<br>\n";
}
Página 49/115
Iniciación a PHP 4 4.- FUNCIONES
$func = 'nada';
$func(); // Esto sacará por pantalla: Estamos dentro de la función nada()
$func = 'algo;
$func( 'test' ); // Esto sacará por pantalla:
// Estamos dentro de la función algo() a la cual se le ha pasado el parámetro 'test'.
?>
Por ejemplo, si uno ya ha creado un serie de funciones para obtener y tratar determinados
ficheros dentro de un directorio, es probable que esas funciones nos puedan resultar de utilidad en
varias aplicaciones o scripts. En vez de estar continuamente copiando y pegando el código de dichas
funciones, es mucho más interesante meter todas esas funciones dentro de un fichero aparte. A
continuación se le puede dar a ese fichero el nombre lib_manejo_ficheros.php e incluirlo en todos los
scripts que requieran el uso de dichas funciones.
Ejemplo:
<?php
// Librería de manejo de ficheros
// Última actualización: 20-4-2003
function saca_ficheros($dir)
{
...
}
function saca_directorios($dir)
{
...
}
function saca_todos_fich($dir)
{
...
}
function saca_fich_jpg($dir)
{
...
}
Página 50/115
Iniciación a PHP 4 4.- FUNCIONES
function saca_fich_gif($dir)
{
...
}
?>
Si ahora queremos incluir la librería anterior dentro nuestro script basta hacer:
<?php
// Script que muestra todos los ficheros que hay dentro de nuestra web y da trato especial
// a los ficheros de imágenes.
?>
include (path/filename);
require (path/filename);
include “path/filename”;
require “path/filename”;
require() no es en realidad una función de PHP; es más una construcción del lenguaje. Está
sujeta a algunas reglas distintas de las de funciones. Por ejemplo, require() no esta sujeto a ninguna
estructura de control contenedora. Por otro lado, no devuelve ningún valor (con include() sí que es
posible, aunque nosotros no lo vamos a ver); intentar leer un valor de retorno de una llamada a un
require() resulta en un error del intérprete.
Esto significa que no se puede poner una sentencia require() dentro de una estructura de
bucle y esperar que incluya el contenido de un archivo distinto en cada iteración. Para hacer esto, usa
una sentencia include().
Página 51/115
Iniciación a PHP 4 4.- FUNCIONES
Debido a que include() es una construcción especial del lenguaje, se debe encerrar dentro de
un bloque de sentencias si está dentro de un bloque condicional.
if ($condicion)
include($archivo);
else
include($otro);
/* Esto es CORRECTO. */
if ($condicion) {
include($archivo);
} else {
include($otro);
}
PHP no soporta la sobrecarga de funciones y eso significa que dos funciones no pueden estar
declaradas con el mismo nombre. Por lo tanto, si una librería con funciones es incluida o requerida
varias veces, el parseador dará error alegando a que no se puede redeclarar una función (y dará el
error con la primer función que encuentre declarada dos veces). Por tanto, hay que tener mucho
cuidado de no incluir o requerir una librería de funciones varias veces dentro de un script, o incluir o
requerir dos librerías diferentes pero que compartan el nombre de algunas funciones.
Para hacer la vida del programador un poco más fácil, PHP permite usar require_once() e
include_once() que funcionan igual que las anteriores salvo que antes de requerir o incluir el archivo,
primero comprueban si ya se ha requerido o incluido con anterioridad. Si este es el caso, no se
requiere o incluye de nuevo.
Página 52/115
Iniciación a PHP 4 5.- VECTORES
5.- VECTORES
En el capítulo 2 se explicó los tipos de vectores existentes en PHP, así como la forma de
crearlos, pero no se vieron las posibles formas de recorrerlos. Tampoco se describió la estructura
interna de los vectores en PHP.
Además de lo anterior, este capítulo pretende introducir algunas de las funciones más
interesantes y comúnmente usadas de las que PHP dispone con respecto al tema de vectores.
Pero en ambos casos, la longitud del vector queda fija. Si queremos vectores de longitud
variable dónde podamos crear y borrar elementos a nuestras anchas, tendremos que acudir a listas
enlazadas.
En ambos casos vect apunta al inicio del vector. Dicho de otra manera, vect contiene la dirección de
memoria dónde está contenido el primer elemento del vector.
vect[5];
Internamente lo que se hace es multiplicar 5 x los bytes que ocupa un entero y hacer ese
desplazamiento a partir de la posición de memoria dónde vect apunta.
Toda esta gestión se puede realizar gracias a que se sabe lo que ocupa (en bytes) cada
elemento del vector.
En PHP, las variables no tienen un tipo fijo. Así, una variable que líneas anteriores se había
considerado como un entero, ahora puede estar funcionando como un carácter. Ello conlleva a que
no haya ningún tipo de restricción con respecto al tipo de los elementos de un vector. De hecho en la
posición 0 puede estar almacenado un número mientras que en la posición 3 puede estar
almacenado un vector o una cadena de caracteres. Todo esto implica que el funcionamiento de los
vectores en PHP sea mucho más sofisticado que el funcionamiento visto en C.
Un vector en PHP no sólo almacena los valores que le damos, también almacena la clave que
hace referencia a dicho valor. Veámoslo con un ejemplo:
$vect[0]=25;
$vect[1]=”hola”;
$vect[7]=2.25;
Página 53/115
Iniciación a PHP 4 5.- VECTORES
Luego en resumen, lo que se pone entre los corchetes, es la clave que identifica al valor. Lo
elementos se van poniendo en el mismo orden en que se insertan en el vector, independientemente
del valor de la clave.
$nom_vect[$key]=$value;
Ahora ya se puede entender por qué en PHP existen los llamados vectores asociativos. La
clave no tiene por qué se únicamente numérica, puede ser una cadena de texto. PHP los trata igual.
Todo esto permite una flexibilidad enorme. PHP incorpora funciones tanto para ordenar los elementos
por valor como para ordenarlos por clave. Incluso incorpora funciones para intercambiar cada valor
por su respectiva clave (es decir, las claves pasan a ser valores y los valores pasan a ser claves).
Aunque este sistema puede parecer de lo más extraño, optimiza mucho la implementación
interna de los vectores. Imagina que un programador crea un vector de 10 elementos e introduce los
datos de la siguiente manera:
$vect[2000]=”Oscar”;
$vect[1]=”Margarita”;
$vect[50]=”Roberto”;
$vect[100]=”David”;
$vect[0]=”José”;
¿Qué crees que debe hacer PHP? ¿definir un vector de 2000 elementos? ¿y de qué tamaño?
cada elemento puede tener tipos distintos y de tamaños diferentes.
$vect
Posición 0 1 2 3 4
Clave 2000 1 50 100 0
Valor Oscar Margarita Roberto David José
De esta forma siempre se le permite al programador acceder por la clave que desee o
también se le da la alternativa de recorrer el vector por el orden en que los elementos se insertaron.
Esto se verá en detalle dentro del apartado RECORRIDO DE VECTORES.
Además de todo lo anterior, es conveniente comentar que cada vector dispone de un puntero
interno que apunta al elemento actual. Dicho puntero sólo puede ser manipulado con funciones que
PHP suministra. Más adelante veremos la utilidad de dicho puntero.
sizeof
Devuelve el número de elementos contenidos dentro del vector matriz. Lo que se le pasa a
sizeof no tiene por qué ser un vector unidimensional, se le puede pasar una matriz (vector
Página 54/115
Iniciación a PHP 4 5.- VECTORES
bidimensional) o un vector k-dimensional. Eso sí, sizeof sólo devuelve el número de elementos de la
primera dimensión. Veamos un ejemplo:
<?php
// Vamos a crear un vector unidimensional
$vect_uni = array (‘X-men’,’Matrix’,’Simpsons’);
sizeof($vect_uni); // Devolverá 3
$vect_bi[‘Matrix’][0]=’Trinity’;
$vect_bi[‘Matrix’][1]=’Neo’;
$vect_bi[‘Matrix’][2]=’Morpheus’;
$vect_bi[‘Simpons’][0]=’Homer’;
$vect_bi[‘Simpons’][1]=’Lisa’;
$vect_bi[‘Simpons’][2]=’Bart’;
$vect_bi[‘Simpons’][3]=’Maggie’;
sizeof($vect_bi);
// También devolverá 3, pues devuelve el número de elementos de la primera dimensión.
// Pero gracias a la flexibilidad de PHP, si dentro de una posición de un vector se encuentra otro
// vector, sizeof devuelve el tamaño de ese vector. Veámoslo con el caso anterior:
sizeof($vect_bi[‘X-men’]);
/* Puesto que en la posición identificada por ‘X-men’ hay un vector y no un valor, sizeof devolverá el
número de elementos de ese vector, esto es 5 */
sizeof($vect_bi[‘Matrix’]);
/* Ocurrirá lo mismo que en el caso anterior, sólo que ahora con el vector ‘Matrix’. Devolverá, por
tanto 3 */
// Si tuviéramos más dimensiones dentro de $vect_bi, podríamos hacer lo mismo sobre cada una
// de ellas.
?>
count
o Si la variable existe y es un vector (no tiene por qué ser de una dimensión!), count()
devolverá el número de elementos contenidos dentro del vector.
o Si la variable existe pero no es un vector, se devolverá el valor 1.
o Si la variable no existe, se devolverá el valor 0.
IMPORTANTE: count() puede devolver 0 para una variable no definida, pero también puede devolver
0 para una variable ya inicializada pero con un vector vacío. Habría que utilizar isset() para
comprobar si una variable está definida o no.
NOTA: A isset() se le pasa un variable. Si la variable existe devuelve TRUE en caso contrario
devuelve FALSE. Si se quisiera destruir una variable, se puede usar la función unset().
Página 55/115
Iniciación a PHP 4 5.- VECTORES
array_count_values
Esta función es una variante de las dos anteriores. En vez de devolver el número de
elementos, cuenta la frecuencia con que se da cada elemento. Para que esta función no de un error,
se le ha de pasar un vector unidimensional. Veamos un ejemplo:
<?php
$notas = array(4,5,4,5,6,8,7,8,9,7,10,4,7,3,2,7,5,6);
$c_notas = array_count_values($notas);
// Si ahora hacemos:
print_r($c_notas);
Y que significa que el valor 4 está repetido 3 veces, el valor 5 está repetido 3 y así sucesivamente
*/
print_r($c_nombres);
La interpretación es que Jose aparece 3 veces, Gabriel aparece 1 vez, y así sucesivamente.
*/
?>
IMPORTANTE:
array_count_values solo funciona con vectores de números enteros o cadenas de caracteres.
Si se trata de utilizar con cualquier otra cosa dará el siguiente error: Warning: Can only count
STRING and INTEGER values! in c:\phpdev\www\pruebas\sizeof_y_count.php on line 39
<?php
$vect=array(1,2,3,4,5,6,7,8,9,10);
/*
Recordemos que cuando creamos un array como está descrito arriba, PHP genera las claves
automáticamente y es equivalente a hacer:
$vect[0] = 1;
$vect[1] = 2;
…
$vect[9] = 10;
Página 56/115
Iniciación a PHP 4 5.- VECTORES
*/
$num_elements = count($vect);
Este sistema es el más conocido y usado pero debido a la flexibilidad de PHP este sistema
tiene algunas pegas. En PHP los vectores NO tienen por qué comenzar en 0. Podríamos crear un
vector cuyos índices (recordemos que en PHP se llaman claves) fueran 1, 3, 5, 100, 1000 y 777. Al
intentar recorrer el vector de la manera anterior tendríamos un problema: count($vect) devolverá 6
(hay 6 elementos en el vector) y trataríamos de acceder a los elementos 0, 1, 2, 3, 4 y 5. Cómo sólo
existen 3 de esos elementos PHP sólo mostraría los elementos cuyas claves existen, en el resto no
haría nada.
Si se trata de acceder a un elemento mediante una clave que no existe en el vector, PHP no
dará error. Si se trata de imprimir tampoco dará error, simplemente no se mostrará nada.
NOTA: Si se trata de acceder a una variable que no está definida (es decir, que no existe), al igual
que en el caso de los vectores, PHP no dará ningún error. Lo mismo pasa a la hora de imprimirla por
pantalla: PHP no mostrará nada.
En PHP existen dos formas adicionales a la ya vista. Además son válidas para cualquier tipo
de vector, tanto asociativos como no asociativos
FOREACH
<?php
// Jugamos con el mismo vector que antes
$vect=array(1,2,3,4,5,6,7,8,9,10);
$i=0;
foreach($vect as $value)
{
switch ($i)
{
Página 57/115
Iniciación a PHP 4 5.- VECTORES
El ejemplo anterior producirá el mismo resultado que cuándo hemos usado el bucle for() pero
con una gran diferencia VALE PARA CUALQUIER TIPO DE VECTOR, independientemente de si el
vector es asociativo, no asociativo, mixto o no asociativo pero con las claves puestas arbitrariamente.
Además, se garantiza el acceder a los datos exactamente en el mismo orden en que fueron
insertados en el vector (lo cual puede ser MUY interesante para determinadas tareas).
Foreach permite, además, conocer la clave del valor actual. Veamos otro ejemplo;
<?php
$regiones_dvd = array(
1 => 'USA, Canada, territorios USA ',
2 => 'Japón, Europa, Sur África, Medio Este (incluyendo Egipto)',
3 => 'Sureste de Asia y Este de Asia (incluye Hong Kong)',
4 => 'Australia, Nueva Zelanda, Islas de Pacifico, América Central, Sudamérica, Caribe.',
5 => 'Europa del Este (Unión Soviética), subcontinente Indio, África, Corea del Norte, Mongolia',
6 => 'China',
7 => 'Reservado',
8 => 'Especial para usos internacionales (aviones, cruceros, etc...)'
);
Como se puede observar, foreach() simplifica mucho el recorrido de los vectores y permite
crear funciones que recorran o jueguen con los vectores independientemente de cómo estén
construidos.
Es importante comentar que foreach() también funciona bien si cada elemento del vector es,
a su vez, un nuevo vector. Veamos un ejemplo:
<?php
// Cine
// Ejemplo con un vector multidimensional que en la primera dimensión guarda los géneros y cada
// género almacena un vector asociativo dónde la clave es el nombre de la película y el valor es su
// puntuación:
$pelis['Terror']=array(
'The Eye' => 7.5,
'Dark Water' => 8.5,
'DeathWatch' => '?',
'Dreamcatcher' => 7,
'Dog Soldiers' => '?',
'Darkness' => 9
);
Página 58/115
Iniciación a PHP 4 5.- VECTORES
$pelis['Comedia']=array(
'Yo yo mismo e Irene' => 8,
'La máscara' => 8.5,
'Colega, Dónde está mi coche?' => 7.5
);
$pelis['Fantasia']=array(
'El señor de los anillos' => 9.8,
'Matrix' => 10,
'Final Fantasy' => 8.75,
'Hero' => 9, 'Legend of Zu' => 8.5
);
LIST Y EACH
Cuando se habló de la construcción interna de los vectores, se comentó de pasada que cada
vector en PHP disponía de un puntero interno. Hasta el momento no hemos visto la utilidad que tiene
esto ni cómo manejar dicho puntero. Pues bien, ahora veremos cómo recorrer un vector haciendo uso
de dicho puntero. Veamos primero las funciones each() y list() :
each
(PHP 3, PHP 4 )
each -- Devuelve el par clave/valor actual de una matriz y avanza el puntero de la misma.
Descripción:
Página 59/115
Iniciación a PHP 4 5.- VECTORES
key => 0
value => 'bob'
list
(PHP 3, PHP 4 )
list -- Asigna valores a variables que se le pasan, a partir de los elementos de un vector.
Descripción:
// Sólo nos queremos quedar con el año, mes y día pero en variables separadas
// para poder trabajar con ellas más comodamente
list($ano,$mes,$dia) = $fecha;
IMPORTANTE: list() sólo funciona con vectores no asociativos (es decir, cuyas claves son
puramente numéricas) o vectores mixtos (con claves numéricas y de texto, aunque se saltará los
elementos con clave no numérica). Si se le pasa un vector puramente asociativo, no dará error pero
no les asignará nada a las variables pasadas.
<?php
// Animación Japonesa
Página 60/115
Iniciación a PHP 4 5.- VECTORES
Aunque este método de recorrer vectores es muy similar al realizado con foreach(), hay
algunas diferencias significativas que hay que comentar:
foreach usa una copia del vector y por tanto no modifica la posición interna del puntero
del vector. Además, nada más hacer la copia, hace un reset() para colocar el puntero al
principio del vector.
each va modificando el puntero interno del vector y, por lo tanto, cuando acaba de
recorrer el vector, el puntero apunta al último elemento. Además, si cortamos la ejecución
del bucle a mitad del while, el puntero se quedará apuntando al elemento siguiente del
último elemento accedido. Siempre que comencemos a recorrer un vector con each y list
hay que hacer un reset del vector puesto que nadie nos garantiza que el puntero interno
apunte al primer elemento.
A parte de reset, existen otras funciones que permiten mover el puntero interno hacia la posición
que más nos convenga:
reset
(PHP 3, PHP 4 )
reset -- Coloca el puntero interno de una matriz a su primer elemento y devuelve el valor de éste.
Descripción:
end
(PHP 3, PHP 4 )
Descripción:
current
(PHP 3, PHP 4 )
current -- Devuelve el valor del elemento actual de una matriz apuntado por el vector interno
Descripción:
current() devuelve el elemento de la tabla al que apunta el puntero interno. No mueve el puntero de
ninguna manera. Si el puntero interno apunta fuera del final de la lista de elementos, current()
devuelve FALSE.
Página 61/115
Iniciación a PHP 4 5.- VECTORES
AVISO: Si la matriz contiene elementos vacíos (0 ó "", la cadena vacía) esta función devolverá
FALSE para dichos elementos. Esto hace imposible determinar si se está realmente al final de la lista
en tales matrices usando current(). Para recorrer adecuadamente una matriz que pueda contener
elementos vacíos, utilice la función each().
next
(PHP 3, PHP 4 )
next -- Avanza el puntero interno de una matriz al siguiente elemento y devuelve su valor
Descripción:
next() se comporta como current(), con una diferencia. Avanza el puntero interno de la matriz en una
posición antes de devolver el elemento. Eso significa que devuelve el siguiente elemento de la matriz
y que avanza el puntero interno en uno. Si al avanzar se pasa del final de la lista de elementos, next()
devuelve FALSE.
AVISO: Si la matriz contiene elementos vacíos (0 ó "", la cadena vacía) esta función devolverá
FALSE para dichos elementos. Esto hace imposible determinar si se está realmente al final de la lista
en tales matrices usando current(). Para recorrer adecuadamente una matriz que pueda contener
elementos vacíos, utilice la función each().
prev
(PHP 3, PHP 4 )
prev -- Retrocede el puntero interno de una matriz al elemento anterior y devuelve su valor
Descripción:
AVISO: Si la matriz contiene elementos vacíos (0 ó "", la cadena vacía) esta función devolverá
FALSE para dichos elementos. Esto hace imposible determinar si se está realmente al final de la lista
en tales matrices usando current(). Para recorrer adecuadamente una matriz que pueda contener
elementos vacíos, utilice la función each().
key
(PHP 3, PHP 4 )
key – Devuelve el valor de la clave del elemento actual apuntado por el vector interno
Descripción:
A diferencia de current(), si el elemento actual apuntado tiene un valor vacío (0 ó "", la cadena vacía)
la clave se devuelve correctamente.
Página 62/115
Iniciación a PHP 4 5.- VECTORES
A parte de estas funciones, existe una última llamada array_walk() que permite aplicar una
función a cada elemento del vector. Esto puede ser extremadamente útil si, por ejemplo, tenemos que
elevar al cuadrado todos los elementos, pasar todos los elementos a mayúsculas/minúsculas, o
eliminar elementos que no cumplan alguna condición.
array_walk
(PHP 3>= 3.0.3, PHP 4 )
array_walk -- Aplica una función del usuario a cada elemento de una matriz.
Descripción:
<?php
reset ($frutas);
// Este reset no haría falta pues siempre que un vector es creado, el puntero interno
// apunta a la primer elemento.
array_walk ($frutas, 'test_ver');
reset ($frutas);
array_walk ($frutas, 'test_alterar', 'fruta');
reset ($frutas);
array_walk ($frutas, 'test_ver');
?>
Página 63/115
Iniciación a PHP 4 5.- VECTORES
Puesto que también puede ser interesante buscar una clave en vez de un valor, PHP
suministra la siguiente función: array_key_exists() que realiza una función similar a la anterior sólo
que con las claves del vector.
in_array
(PHP 4 )
Descripción:
NOTA: Se busca EXACTAMENTE la aguja. Eso significa que si es una cadena de caracteres, las
2
cadenas deben ser idénticas (sensible a mayúsculas y minúsculas). Las expresiones regulares no
están permitidas.
array_search
(PHP 4 >= 4.0.5)
Descripción:
NOTA: En versiones anteriores a PHP 4.2.0, array_search() devuelve NULL en vez de FALSE.
Si el tercer parámetro opcional strict se pone a TRUE entonces array_search() comprobará también
los tipos de la aguja y los elementos del pajar. Es decir, para que la búsqueda acabe con éxito no
sólo se ha de encontrar la aguja, los elementos deben coincidir también en el tipo. Tampoco se
permite el uso de expresiones regulares.
array_key_exists
(PHP 4 >= 4.1.0)
Descripción:
2
Las expresiones regulares permiten comprobar si un string cumple un determinado patrón. Por ejemplo que la
primera letra comience por “a”, que acabe en “ia” o que contenga el trozo “orden”.
Página 64/115
Iniciación a PHP 4 5.- VECTORES
necesidad importante (sobre todo a la hora de mostrar los datos al usuario). Siempre podemos
implementar nuestras propias funciones de ordenación: quicksort, mergesort, etc... Pero, para
simplificarnos la vida, PHP ya lleva implementadas unas cuantas funciones que realizan estas tareas.
sort y rsort
Son las funciones más básicas de ordenación. Las dos funciones son idénticas salvo que una
ordena en sentido ascendente (sort) y la otra en sentido descendente (rsort – reverse sort).
<?php
// Con vector no asociativo
$vect = array ('banana', 'pera', 'manzana', 'kiwi', 'uva', 'mango', 'paraguaya');
// Ordenamos el vector
sort($vect);
Si tratamos de hacer lo mismo pero con un vector asociativo, nos encontramos con lo
siguiente:
<?php
// Con un vector asociativo
$vect = array ("Spriggan" => 7.5, "Akira" => 9, "3x3 Ojos" => 8, "Shadow Skill" => '?');
// Ordenamos el vector
sort($vect);
Página 65/115
Iniciación a PHP 4 5.- VECTORES
Todas las claves de texto se pierden y se sustituyen por claves numéricas. Ahora cada clave
coincide con la posición que cada elemento ocupa dentro del vector ordenado.
IMPORTANTE: El vector que se le pase a sort() debe ser un vector unidimensional, si no PHP dará
un error (sólo se ordena la primera dimensión).
asort y arsort
Funcionan de forma similar a las dos anteriores: asort ordena ascendentemente y arsort
descendentemente. La diferencia estriba en que aquí SÍ que se mantiene la relación clave/valor.
<?php
// Con vector no asociativo
$vect = array ('banana', 'pera', 'manzana', 'kiwi', 'uva', 'mango', 'paraguaya');
// Ordenamos el vector
asort($vect);
Ahora las claves sí que se mantienen asociadas a su valor. Veamos un último ejemplo con un
vector asociativo:
<?php
// Con un vector asociativo
Página 66/115
Iniciación a PHP 4 5.- VECTORES
$vect = array ("Spriggan" => 7.5, "Akira" => 9, "3x3 Ojos" => 8, "Shadow Skill" => '?');
// Ordenamos el vector
asort($vect);
ksort y rksort
Hasta ahora venimos ordenando valores pero más importante que ordenar por valores puede
serlo ordenar por claves. En el último ejemplo visto estábamos ordenando un vector que contenía
películas de animación (clave) y la puntuación respectiva (valor). Puede ser igual de interesante hacer
la ordenación por puntuación que por el nombre de las películas. Pensemos que si el usuario quiere
buscar una película en particular le resultará más sencillo encontrarla si las películas se muestran
ordenadas por nombre que por la puntuación.
Como de costumbre, ksort ordena el vector por claves ascendentemente mientras que rksort
lo hace descendentemente.
Por descontado que aquí SE MANTIENE la relación clave/valor, si no esto no tendría sentido.
Veamos un ejemplo:
<?php
ksort($pelis);
A parte de las funciones ya vistas, existen otras tres que permiten realizar ordenaciones
según nuestro propio criterio.
Estas funciones ordenaran un vector utilizando una función suministrada por el usuario. La
función de comparación deberá devolver un entero menor, igual, o mayor que cero, si el primer
argumento se considera respectivamente menor que, igual que, o mayor que el segundo. Si dos
miembros resultan ser iguales, su orden en la matriz ordenada será cualquiera.
Resumiendo, la idea es suministrarle una función que indique como quedarían un par de
valores ordenados (llamémosles $a y $b):
Por ejemplo, nos puede interesar ordenar un vector en función del tamaño de la cadena de
texto. Es decir, lo que queremos es que las cadenas más cortas estén al principio y las más largas al
final del vector. Luego en nuestro caso:
o Si la longitud de la cadena $a es menor que la longitud de la cadena $b, $a irá antes que $b
o Si la longitud es idéntica, nos da igual el orden
o Si la longitud de la cadena $a es mayor que la longitud de la cadena $b, $b irá antes que $a
<?php
El caso es distinto cuando trabajamos con listas enlazadas. Puesto que cada elemento es
una entidad diferente, basta con colocarse sobre el nodo a eliminar, actualizar los punteros y luego
proceder a su borrado.
Puesto que en PHP los vectores son ya de por sí elementos dinámicos y que pueden
funcionar de muchas formas diferentes, el borrado de elementos es posible. Podemos borrar
elementos de la forma más sencilla posible: usando la función unset(). Unset destruye cualquier tipo
de variable, incluso elementos de un vector. PHP ya se encarga de reestructurar el vector por dentro.
Veamos un ejemplo:
<?php
// Definimos un sencillo vector de enteros
$vect = array (5, 7, 7, 8, 9, 0, 6, 1);
// Borramos la posición 0
unset($vect[0]);
Página 69/115
Iniciación a PHP 4 5.- VECTORES
echo "<br>\n";
En el siguiente ejemplo vamos a borrar todos aquellos elementos que sean múltiplos de 2:
<?php
// Creamos un vector de números enteros
$vect_nums = array (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
PHP suministra, además, otras funciones que facilitan el uso de un vector como si de una pila
o cola se tratase.
array_push y array_pop
array_push() considera vector como una pila, e inserta las variables que se le pasan al final de éste.
La longitud de la vector se incrementa en el número de variables insertadas. Tiene el mismo efecto
que ejecutar:
$matriz[] = $var;
array_pop() realiza el procedimiento inverso: extrae y devuelve el último valor del vector, acortando
el vector en un elemento. Ejemplo:
Tras esto, $pila contiene sólo 2 elementos: "naranja" y "manzana", y $fruta contiene "frambuesa".
array_unshift y array_shift
Página 70/115
Iniciación a PHP 4 5.- VECTORES
Estas dos funciones son exactamente iguales a las ya vistas, excepto que las de arriba
insertan los elementos al final y éstas al principio.
array_pad
array_pad() Devuelve una copia del vector rellenada hasta el tamaño tam_relleno con el valor
valor_relleno. Si tam_relleno es positivo, entonces la matriz es rellenada por la derecha, y si es
negativo, por la izquierda. Si el valor absoluto de tam_relleno es menor o igual que el tamaño del
vector no se produce relleno alguno. Ejemplo:
o range()
o array_keys() | array_values()
o array_reverse() | array_flip()
o shuffle()
range
(PHP 3>= 3.0.8, PHP 4 )
Descripcion:
range() devuelve un vector de elementos desde inferior hasta superior, ambos incluidos. Si inferior >
superior, la secuencia se generará descendentemente. Si inferior < superior, la secuencia se
generará ascendentemente.
Página 71/115
Iniciación a PHP 4 5.- VECTORES
<?php
// array(0,1,2,3,4,5,6,7,8,9)
foreach(range(0, 9) as $number) {
echo $number;
}
array_keys
(PHP 4 )
Descripción:
array_values
(PHP 4 )
Descripción:
Página 72/115
Iniciación a PHP 4 5.- VECTORES
array_reverse
(PHP 4 )
Descripción:
Esto hace que $resultado contenga array (array ("verde", "rojo"), 4.0, "php").
array_flip
(PHP 4 )
Descripción:
// Ahora lo transponemos
$trans = array_flip ($trans);
// Imprimimos por pantalla la transposición
print_r($trans); echo "<br>"; // Array ( [a] => A [b] => B [c] => C )
array_merge
(PHP 4 )
Descripción:
Página 73/115
Iniciación a PHP 4 5.- VECTORES
array_slice
(PHP 4 )
Descripción:
array_splice
(PHP 4 )
Descripción:
array array_splice ( array entrada, int desplazamiento [, int tamano [, array sustitucion]])
array_splice() suprime los elementos designados por el desplazamiento y el tamano de la matriz
entrada, y los sustituye con los elementos de la matriz de sustitucion si se especifica.
Si el desplazamiento es positivo, el comienzo de la parte suprimida sería en esa posición desde el
comienzo de la matriz de entrada. Si el desplazamiento es negativo, se cuenta la posición desde el
final de la matriz de entrada.
Si se omite tamano, se suprime todo desde el desplazamiento hasta el final de la matriz. Si se
especifica el tamano y es positivo, se suprimirán tantos elementos como se especifica. Si fuera
negativo, el final de la porción eliminada estará a tantos elementos del final de la matriz. Truco: para
eliminar todo desde el desplazamiento hasta el final de la matriz cuando también se especifica
sustitucion, utilice count($entrada) como tamano.
Si se especifia la matriz de sustitucion, entonces los elementos suprimidos son reemplazados con los
elementos de dicha matriz. Si los valores de desplazamiento y tamano son tales que nada es borrado,
los elementos de la matriz sustitucion se insertarán en la posición indicada por el desplazamiento.
Truco: si sólo se va a sustituir algo por un elemento nada más, no hace falta poner array() alrededor
del mismo, salvo que dicho elemento sea una matriz en sí mismo.
Las siguientes funciones son equivalentes:
Página 74/115
Iniciación a PHP 4 5.- VECTORES
shuffle
(PHP 3>= 3.0.8, PHP 4 )
Descripción:
Nota: srand() inicializa el generador de números aleatorios con la semilla pasada. Siempre es mejor
trabajar con una semilla aleatoria que con una por defecto.
Página 75/115
Iniciación a PHP 4 6.- FICHEROS Y Entrada/Salida
Antes de trabajar con un fichero, lo más normal es comprobar su existencia. Esto lo podemos
hacer con la función file_exists(). El único inconveniente que tiene ésta función, es que no distingue
entre ficheros y directorios. Eso significa que si en lugar de pasarle un fichero se le pasa un directorio,
file_exists devolverá cierto si el directorio existe.
Si además necesitamos conocer el tamaño de un fichero, basta con hacer una llamada a la
función filesize(). Ésta se encarga de devolver el tamaño del fichero en bytes.
file_exists
(PHP 3, PHP 4 )
Descripción:
NOTA: Las funciones que sacan información sobre el estado de un fichero suelen ser muy costosas.
Para ahorrar algo de tiempo, PHP “cachea” (almacena) el resultado. Eso significa que si se vuelve a
preguntar por el mismo archivo, no se vuelve ha realizar la comprobación, se usa el resultado
anterior. Si se desea forzar un nuevo chequeo del estado del fichero (por si el fichero puede cambiar
o desaparecer) hay que usar la función clearstatcache().
is_file
(PHP 3, PHP 4 )
Descripción:
IMPORTANTE: Aunque no se indique por ninguna parte, esta función no se comporta de la forma
esperada. Cuando se la pasa el nombre de un fichero, sólo se mira si ese fichero existe en el
directorio actual de trabajo. No vale pasarle el path completo del archivo. Eso significa que si se
desea comprobar la existencia del fichero “./docs/quijote.txt”, primero habrá que hacer un cambio de
Página 76/115
Iniciación a PHP 4 6.- FICHEROS Y Entrada/Salida
Se puede consultar más sobre esto en la página www.php.net. Basta con buscar la función is_file y
luego leer las notas colgadas por otros programadores.
Es posible que el resto de funciones de la familia is_xxx tengan el mismo problema (De echo is_dir
también lo tiene).
filesize
(PHP 3, PHP 4 )
Descripción:
NOTA: Puesto que al preguntar el tamaño de archivos grandes pueden aparecer cifras grandes, lo
que se puede hacer es poner las unidades. Eso se puede conseguir dividiendo el tamaño del archivo
entre:
10
2 (1024) para obtener los KBytes
20
2 (1048576) para obtener los Mbytes
30
2 (1073741824) para obtener los GBytes
Siempre que se desea leer o escribir sobre un archivo, hay que abrirlo antes. Una vez abierto,
y dependiendo de las propiedades al abrir el fichero, podremos escribir o leer de él. Una vez que
hayamos acabado de trabajar con él, es importante que lo volvamos a cerrar. Como se puede
suponer, fopen() abre un fichero y fclose() lo cierra.
fopen
(PHP 3, PHP 4 )
Descripción:
'r' - Abre para sólo lectura; sitúa el apuntador del fichero al comienzo del mismo.
'r+' - Abre para lectura y escritura; situa el apuntador del fichero al comienzo del fichero.
'w' - Abre para sólo escritura; sitúa el apuntador del fichero al comienzo del fichero y trunca el fichero
con longitud cero. Si el fichero no existe, trata de crearlo.
Página 77/115
Iniciación a PHP 4 6.- FICHEROS Y Entrada/Salida
'w+' - Abre el fichero para lectura y escritura; sitúa el apuntador del fichero al comienzo del fichero y
trunca el fichero con longitud cero. Si el fichero no existe, trata de crearlo.
'a' - Abre sólo para escribir (añadir); sitúa el apuntador del fichero al final del mismo. Si el fichero no
existe, trata de crearlo.
'a+' - Abre para lectura y escritura (añadiendo); sitúa el apuntador del fichero al final del mismo. Si el
fichero no existe, trata de crearlo.
Además, mode puede contener la letra 'b'. Esto es útil para sistemas que diferencian entre ficheros
binarios y de texto (ej. es inútil en Unix). Si no se necesita, será ignorado.
Puede usarse el tercer parámetro opcional y fijarlo a "1", si también se quiere buscar el fichero en el
include_path.
Si experimentas problemas a la hora de leer y escribir a ficheros y estas usando la versión de PHP
como módulo para el servidor, recuerda que debes asegurar que los ficheros y directorios que estas
usando son accesibles al proceso servidor.
fclose
(PHP 3, PHP 4 )
Description:
Escritura en Ficheros
Antes de abrir un archivo, puede ser interesante saber si podemos escribir sobre él. Ya
hemos visto que la función is_file, a parte de comprobar si el elemento pasado es realmente un
fichero, también comprueba si sobre el fichero destino se puede leer y escribir. Como pudiera darse el
caso que tuviéramos permisos de escritura y no de lectura, la función anterior no nos valdría. La
función is_writeable() nos dice, exclusivamente, si el fichero existe y se puede escribir sobre él.
Una vez que el fichero ha sido abierto con éxito usaremos la función fwrite() para escribir
sobre él.
is_writeable
(PHP 3, PHP 4 )
Descripción:
Página 78/115
Iniciación a PHP 4 6.- FICHEROS Y Entrada/Salida
fwrite
(PHP 3, PHP 4 )
Descripción:
Lectura de Ficheros
Al igual que en el caso anterior, antes de abrir un fichero para leer datos, puede ser
interesante comprobar si podemos leer de él. is_readable() comprueba si un fichero existe y
podemos leer de él.
Una vez que el fichero se ha abierto correctamente, disponemos de bastantes maneras para
leer de él:
A parte de estas funciones, existen otras que pueden resultar igual de interesantes. file() lee
un fichero y lo almacena en un vector dónde cada fila del vector es una línea del fichero. Por otro
lado, si lo que queremos es que un archivo se lea y se muestre directamente por pantalla, readfile()
nos soluciona la papeleta.
is_readable
(PHP 3, PHP 4 )
Descripción:
fread
(PHP 3, PHP 4 )
Descripción:
Página 79/115
Iniciación a PHP 4 6.- FICHEROS Y Entrada/Salida
fgetc
(PHP 3, PHP 4 )
Descripción:
fgets
(PHP 3, PHP 4 )
Descripción:
fgetss
(PHP 3, PHP 4 )
fgetss -- Obtiene una línea del fichero apuntado y quita las etiquetas HTML
Descripción;
Página 80/115
Iniciación a PHP 4 6.- FICHEROS Y Entrada/Salida
file
(PHP 3, PHP 4 )
Descripción:
readfile
(PHP 3, PHP 4 )
Descripción:
PHP permite copiar, renombrar y borrar archivos, todo de forma dinámica y según las
necesidades de nuestra web. Cuando necesitamos crear archivos temporales para mostrar datos o
queremos recibir ficheros de usuarios, este tipo de funciones se vuelven totalmente imprescindibles.
copy
(PHP 3, PHP 4 )
Descripción:
rename
(PHP 3, PHP 4 )
Descripción:
unlink
(PHP 3, PHP 4 )
Descripción:
Al igual que nos ocurría con los ficheros, cuando estamos recorriendo el contenido de un
directorio, suele ser interesante saber si el elemento actual es un fichero o un directorio. is_dir()
devuelve cierto si el fichero que se le pasa es un directorio.
is_dir
(PHP 3, PHP 4 )
Descripción:
mkdir
(PHP 3, PHP 4 )
Descripción:
NOTA: Evidentemente mode sólo es valido en sistemas donde los ficheros tengan permisos. Si se
trabaja sobre windows, esto no tiene sentido.
Página 82/115
Iniciación a PHP 4 6.- FICHEROS Y Entrada/Salida
NOTA: Para aclararse con el tema de los permisos, haremos un poco de memoria. Ya hemos dicho
que el primer carácter (el 0) es el que indica el número octal, los siguientes siguen esta estructura U
G O (User Group Others, es decir Usuario Grupo Otros). Luego en el ejemplo anterior U=7, G=0 y
O=0. Ese 7 (o 0) es la representación en octal del conjunto de permiso que U tiene. Recordemos que
cada uno puede tener los siguientes permisos r w x (Read Write eXecute, es decir lectura escritura
ejecución). La idea es poner un 1 dónde se le quiera dar permiso y un 0 dónde no. Esa ristra de tres
dígitos binarios se traduce a octal y ese es el conjunto de permisos que se le ha otorgado (7octal =
111 en binario. Luego el usuario U tiene todos los permisos: lectura, escritura y ejecución). Veamos
una tabla aclaratoria
r w x = Octal Significado
000 0 Sin permisos
001 1 Sólo permiso de ejecución
010 2 Sólo permiso de escritura
011 3 Permiso de escritura y ejecución
100 4 Sólo permiso de lectura
101 5 Permiso de lectura y ejecución
110 6 Permiso de lectura y escritura
111 7 Todos los permisos: lectura, escritura y ejecución
rmdir
(PHP 3, PHP 4 )
Descripción:
opendir
(PHP 3, PHP 4 )
Descripcion:
closedir
(PHP 3, PHP 4 )
Descripcion:
Página 83/115
Iniciación a PHP 4 6.- FICHEROS Y Entrada/Salida
readdir
(PHP 3, PHP 4 )
Descripcion:
Hay que tener en cuenta que readdir() devolverá también las entradas . y ..
Si no se quieren estas entradas, hay que borrarlas manualmente.
<?php <?php
// Con entradas . y .. // Sin entradas . y ..
$handle=opendir('.'); $handle=opendir('.');
echo "Manejador del directorio: $handle\n"; echo "Manejador del directorio: $handle\n";
echo "Archivos:\n"; echo "Archivos:\n";
while ($file = readdir($handle)) { while ($file = readdir($handle)) {
echo "$file\n"; if ( ($file != “.”) && ($file != “..”))
} echo "$file\n";
closedir($handle); }
closedir($handle);
?>
rewinddir
(PHP 3, PHP 4 )
Descripcion:
chdir
(PHP 3, PHP 4 )
Description:
basename
(PHP 3, PHP 4 )
Página 84/115
Iniciación a PHP 4 6.- FICHEROS Y Entrada/Salida
Descripción:
$path = "/home/httpd/html/index.php3";
$file = basename($path); // $file toma el valor "index.php3"
dirname
(PHP 3, PHP 4 )
Descripción:
stat
(PHP 3, PHP 4 )
Descripción:
Página 85/115
Iniciación a PHP 4 6.- FICHEROS Y Entrada/Salida
<?php
$stat=stat("./errors.txt");
print_r($stat);
/* Y la salida es:
Array ( [0] => 2 [1] => 0 [2] => 33206 [3] => 1 [4] => 0 [5] => 0 [6] => 2 [7] => 254 [8] =>
1062870622 [9] => 1062857346 [10] => 1062857056 [11] => -1 [12] => -1 [dev] => 2 [ino] => 0
[mode] => 33206 [nlink] => 1 [uid] => 0 [gid] => 0 [rdev] => 2 [size] => 254 [atime] => 1062870622
[mtime] => 1062857346 [ctime] => 1062857056 [blksize] => -1 [blocks] => -1 )
*/
?>
Permite la conversión de una variable en una cadena de caracteres. Esto puede resultar
extremadamente útil si lo que deseamos es almacenar en un fichero o base de datos variables con
una estructura compleja (arrays n-dimensionales, objetos, etc...) de forma directa.
Por ejemplo, imaginemos que tenemos montada una tienda electrónica. Lo normal es que
vayamos almacenando en algún tipo de estructura todos lo objetos que el usuario quiera comprar. Si
nuestro usuario cierra la sesión sin comprar, puede resultar interesante almacenar los objetos que iba
a comprar y recordárselo la próxima vez que inicie sesión. La función serialize agiliza mucho el
proceso pues podemos guardar la estructura tal y como está pero en formato texto. Cuando
queramos recuperar los datos, leemos la cadena y usamos unserialize que nos reconstruye la
estructura tal y como estaba inicialmente.
serialize
(PHP 3>= 3.0.5, PHP 4 )
Description:
Página 86/115
Iniciación a PHP 4 6.- FICHEROS Y Entrada/Salida
Para volver a convertir la cadena serializada en una variable PHP basta con usar la función
unserialize().
serialize() maneja cualquier tipo (excepto si son recursos). Se pueden serializar incluso
vectores/objetos que contengan referencias a sí mismo, las referencias también serán almacenadas.
Nota: En PHP 3, las propiedades de los objetos eran serializadas, pero se perdían los métodos. PHP
4 elimina dicha restricción.
Conviene consultar la sección Serializando Objetos (Serializing Objects) del punto Clases y Objetos
(Classes and Objects) para más información.
unserialize
(PHP 3>= 3.0.5, PHP 4 )
unserialize -- Crea una variable PHP a partir de una representación serializada anteriormente
Description:
Ejemplo:
<?php
// $v es un vector
$v[]="A";
$v[]="B";
$v[]="C";
$v[]="D";
$v[]="E";
$v[]="F";
// Imprimimos el vector
print_r($v);
// SALIDA: Array ( [0] => A [1] => B [2] => C [3] => D [4] => E [5] => F )
// Serializamos el vector
$v=serialize($v); // Ahora $v es una cadena de caracteres
Página 87/115
Iniciación a PHP 4 6.- FICHEROS Y Entrada/Salida
tempnam
(PHP 3, PHP 4 )
Descripción:
Devuelve el nombre del nuevo fichero temporal, o una cadena nula en caso de fallo.
$tmpfname = tempnam ("/tmp", "tmp_");
tmpfile
(PHP 3>= 3.0.13, PHP 4 )
Description:
parse_ini_file
(PHP 4 )
Description:
Nota: Esta función no tiene nada que ver con el archivo de configuración de php “php.ini”. Dicho
archivo es cargado de forma automática cuando se ejecuta el servidor. Esta función sólo tiene utilidad
para cargar nuestros propios archivos de configuración en nuestros scripts.
IMPORTANTE: Cualquier valor en el archivo de configuración que contenga caracteres que no sean
alfanuméricos ha de estar entre comillas dobles (“”).
Nota: A partir de la versión 4.2.1 de PHP, esta función es afectada por safe_mode and
open_basedir. (Para más información consultar el archivo la ayuda de PHP)
Página 88/115
Iniciación a PHP 4 6.- FICHEROS Y Entrada/Salida
Archivo ejemplo.ini
[first_section]
one = 1
five = 5
animal = BIRD
[second_section]
path = /usr/local/bin
URL = "http://www.example.com/~username"
<?php
// Parsear sin secciones
$ini_array = parse_ini_file("sample.ini");
print_r($ini_array);
Página 89/115
Iniciación a PHP 4 7.- DESARROLLO DINÁMICO DE WEBS
7.1.- Introducción
Hasta el momento no hemos visto más que los pilares del lenguaje PHP, y aunque ya se
pueden intuir las aplicaciones, no hemos visto ningún ejemplo de utilidad real. Una de las
capacidades más interesantes de PHP es la capacidad de crear las páginas que el internauta verá “al
vuelo”.
Una de las primeras ventajas con la que nos encontramos es la capacidad de separar el
diseño de la página de su contenido (mediante Plantillas), evitándonos el costoso trabajo de hacer
copia/pega del código HTML común de cada página. Con este método conseguimos que retocar el
diseño no implique ir archivo por archivo modificando su código. Además, hasta el propio diseño de la
página puede ser dinámico e ir cambiando dependiendo de las fechas o días, según nos pueda
interesar.
Todo esto se puede realizar gracias a que los archivos HTML que nuestro internauta verá son
los que genere nuestro código PHP.
7.2.- Plantillas
Es la base para separar diseño y contenido. Una vez encontrado un diseño web que nos
guste, no tenemos más que trocearlo en partes (secciones) y meter cada parte en una función PHP.
Las partes de un diseño Web suelen ser del tipo: INICIO, TÍTULO, MENU, CONTENIDO,
PIE_DE_PAGINA y FIN. Veamos un ejemplo que aclare lo anterior:
Página 90/115
Iniciación a PHP 4 7.- DESARROLLO DINÁMICO DE WEBS
Ahora vamos a crear una función por cada sección, excepto la del contenido:
Archivo “lib_design.php”:
<?php
// Librería de Diseño
function ini_HTML(){
echo <<<ini_HTML
<!-- Inicio del documento HTML -->
<!doctype html public "-//W3C//DTD HTML 4.0 //ES">
<html>
ini_HTML;
}
function titulo($titulo){
echo <<<TITULO
<!-- Título -->
<head>
<title>$titulo</title>
</head>
<body>
TITULO;
}
function menu(){
echo <<<MENU
<p align="center"><a href="http://www.php.net">PHP</a> |
<a href="http://www.mysql.com">MySQL</a> | <a href="http://www.apache.org">
Apache</a> | <a href="http://www.hotscripts.com">Scripts</a></p>
MENU;
}
function pie(){
echo <<<PIE
<!-- Pie de Página -->
<p align="center"><b><font face="Arial" size="1">Mi pie de página</font></b></p>
</body>
PIE;
}
function fin_HTML(){
echo <<<fin_HTML
<!-- Fin del documento HTML -->
</html>
fin_HTML;
} ?>
Página 91/115
Iniciación a PHP 4 7.- DESARROLLO DINÁMICO DE WEBS
// Includes y requires
include("./lib_design.php");
ini_HTML();
titulo($título);
menú();
pie();
fin_HTML();
Ahora, para ir creando los scripts de nuestra web basta con abrir el fichero anterior, añadirle
el contenido deseado y guardarlo con el nombre que nos interese.
Añadiremos el contenido de la página HTML inicial a nuestra plantilla para ver qué tal queda:
“index.php”:
<?php
// Includes y requires
include("./lib_design.php");
menú();
ini_HTML();
titulo($título);
pie();
fin_HTML();
?>
Como se puede observar a simple vista, las ventajas son múltiples. La primera es que el
código queda mucho más claro. En nuestro caso no se procesa información ni se realizan grandes
tareas, pero si éste fuera el caso, el código quedaría mucho más sencillo de entender. Por ejemplo, si
tuviéramos que acceder a un fichero, procesar los datos y luego mostrarlos por pantalla, el esquema
de nuestro archivo PHP quedaría muy limpio:
Página 92/115
Iniciación a PHP 4 7.- DESARROLLO DINÁMICO DE WEBS
Cada script es independiente del resto. Es decir, cuando un script acaba, todas las variables
que habían sido definidas son destruidas. De hecho, si había archivos abiertos que se habían dejado
sin cerrar, también se cierran. Igual ocurre con los enlaces abiertos a bases de datos y similares (a no
ser que se hubieran abierto enlaces persistentes, algo implica cierto riesgo).
Normalmente un sitio web está compuesto por diversos scripts que van procesando las
peticiones del usuario. Es importante tener en cuenta que un script no tiene por qué devolver una
página html. Es habitual encontrarse scripts que no muestren salida por pantalla y sólo procesan
datos o que muestren 3 o 4 páginas diferentes según las elecciones del usuario. Si las variables se
crean y se destruyen con cada script, es evidente que deben existir métodos de intercambio de
información entre ellos.
PHP suministra tres métodos: GET (mediante la URL), POST (mediante formularios) y
SESSION_VARS (mediante variables de sesión). El primer método lo veremos en este tema, el resto
en los temas 8 y 9 respectivamente.
El Método GET
Por ejemplo, queremos mandarle al archivo links dos variables: SO de valor WIN y proc de valor
AMD. Para ello haríamos:
http://www.mipagina.com/links.php?SO=WIN&proc=AMD
Cuando el archivo links se abra, las variables $SO y $proc estarán ya definidas y con valor
WIN y AMD respectivamente (¡OJO! PHP sí que hace distinción entre mayúsculas y minúsculas tanto
en el nombre de las variables como en sus valores).
Para mostrar estas dos variables desde el archivo links simplemente usaríamos el vector global
$_GET:
echo “Sistema Operativo: {$_GET[‘SO’]}<br>\nProcesador del Tipo: $_GET[‘proc’]”;
Si en el archivo php.ini la opción register_globlals está a On, también se podrían llamar sin más:
echo “Sistema Operativo: $SO<br>\nProcesador del Tipo: $proc”;
Problemas
El hecho que el usuario pueda ver las variables no es importante a no ser que se envíe
información que haga peligrar la seguridad del usuario o del mismo sitio web. Si éste es el caso, se
debería utilizar un método más seguro como el método POST o haciendo uso de variables de sesión.
El principal problema reside en que los caracteres ? y & son caracteres protegidos y no
deben estar contenidos dentro de ninguna variable (Es decir ..?tienda=Marks&Spencer es erróneo
pues crearía dos variables: tienda de valor Marks y Spencer de valor nulo). Incluso un simple
espacio en blanco nos podría dar problemas. Para evitar lo anterior, PHP dispone de dos funciones:
urlencode() y urldecode().
Página 93/115
Iniciación a PHP 4 7.- DESARROLLO DINÁMICO DE WEBS
La primera se encarga en codificar cualquier carácter que no sea “-”, “_” y “.” Por un símbolo
de porcentaje y dos dígitos hexadecimales. La segunda función realiza la tarea inversa. Veámoslo
con el ejemplo anterior:
NOTA: Si no se desea que el usuario visualice o modifique lo que se envía, la información se puede
cifrar o codificar.
NOTA: Aunque es poco habitual, si no conociéramos a priori el número de argumentos que se le van
a pasar a nuestro script, o si no conocemos ni siquiera los nombres de las variables que se nos
pasarán, tenemos varias alternativas aunque la más sencilla e interesante sería hacer un recorrido
del vector $_GET mediante un foreach() sacando el par clave-valor.
NOTA: El vector global $_SERVER almacena una variable interesante llamada QUERY_STRING que
se encarga de almacenar toda la cadena que hay después del ?. Es decir, si tenemos:
www.mipagina.com/listar_usuario.php?nombre=Gabi&mail=gabmecu@inf.upv.es
$_SERVER[‘QUERY_STRING’] = nombre=Gabi&mail=gabmecu@inf.upv.es
Las utilidades son varias. Nos puede servir por si queremos mandar la información codificada o
cifrada a través de la URL. La cadena cuando llega se decodifica o desencripta y luego se trata
convenientemente con funciones como split() o explode() para sacar los pares clave-valor. Veamos
un ejemplo que aclaratorio:
script1.php
<?php
// Script 1: Codificamos la información para el envío
$nombre='Gabi';
$mail='gabmecu@inf.upv.es';
$string_query=base64_encode("nombre=$nombre&mail=$mail");
echo <<<HTML
<a href='script2.php?$string_query'>Mandar datos codificados</a>
HTML;
?>
Página 94/115
Iniciación a PHP 4 7.- DESARROLLO DINÁMICO DE WEBS
script2.php
<?php
// Script 2: Nos llega la información, la decodificamos y la mostramos por pantalla
// La decodificamos
$query_string=base64_decode($_SERVER['QUERY_STRING']);
// $query_string contendrá "nombre=Gabi&mail=gabmecu@inf.upv.es"
/*
Mostrará por pantalla:
7.4.- Redireccionamiento
Como ya se ha comentado con anterioridad, es frecuente encontrarse con scripts que sólo
procesan información o que realizan determinadas tareas y al finalizar llaman a otros scripts. Para
poder realizar el redireccionamiento hay que hacer uso de la función headers().
header("Location: http://www.php.net");
exit;
La primera línea realiza la redirección y la segunda evita que se sigan ejecutando el resto de
instrucciones del script.
3
IMPORTANTÍSIMO: La función header() debe llamarse antes de que se genere salida alguna , bien
con etiquetas HTML normales o con PHP. Un error muy frecuente consiste en leer código con
include() que inserta código html y luego se trata de hacer uso de la función header. Si éste es el
caso, PHP da un error al interpretar el código indicando que las cabeceras ya han sido enviadas
antes de llamar a la función header() (El hecho de mostrar código HTML genera de forma automática
un tipo de cabecera que indica al navegador que va a recibir código HTML).
3
es decir, usando funciones como echo, printf o cualquier otra función que genere salida (código HTML) por
pantalla.
Página 95/115
Iniciación a PHP 4 7.- DESARROLLO DINÁMICO DE WEBS
Los scripts de PHP a menudo generan HTML dinámico que no debe almacenarse en la caché
del navegador cliente o en la caché de cualquier proxy situado entre el servidor y el navegador cliente
(información confidencial o privada). Se puede obligar a muchos proxies y clientes a que deshabiliten
el almacenamiento en caché. Para ello podemos hacer uso de cualquiera de las siguientes
cabeceras:
Hay que evitar pensar que un script PHP equivale a una página HTML. Dependiendo de
nuestras preferencias, puede resultarnos útil tener varias páginas contenidas en un mismo script.
Veamos un sencillo ejemplo que muestra un menú y dependiendo de las elecciones del usuario,
muestra una información u otra:
<?php
// La variable que indica la elección del usuario se llamará $opc
case 2:
// CONTENIDO 2
echo "Aquí iría el contenido de la opción 2";
break;
case 3:
// CONTENIDO 3
echo "Aquí iría el contenido de la opción 3";
break;
default:
// Si vale cualquier otra cosa, volvemos a mostra el menu
header("Location: {$GLOBALS['PHP_SELF']}");
exit;
break;
}
}
?>
Página 96/115
Iniciación a PHP 4 7.- DESARROLLO DINÁMICO DE WEBS
7.6.- Recomendaciones
En el método GET se comentó que en el script destino se podía acceder a las variables
enviadas de dos formas: una mediante el vector global $_GET y otra poniendo register_globals a
On y accediendo a las variables como si fueran simples variables locales. Este último método es el
menos recomendable pues es el más peligroso. Lleva a fallos de seguridad (que pueden consultarse
en http://www.php.net/manual/en/security.registerglobals.php ) y a partir de la versión 4.2.0 de PHP,
register_globals viene a off por defecto.
autorizar.php
<?php
if (usuario_autorizado($nombre, $password)) {
$autorizado = true;
}
if ($autorizado) {
include "/info/privilegiada/data.php";
}
?>
Como se puede observar, debido a un fallo nuestro (no hemos inicializado la variable
$autorizado=FALSE al principio del script), nos podemos encontrar con que gente no autorizada
acceda a información privilegiada.
Si se desea acceder a cualquier variable mandada por el método GET, POST o cookies se
puede usar el vector global $_REQUEST, aunque siempre es recomendable usar su vector
específico: $_GET, $_POST, $_COOKIE o $_FILES. Los métodos GET y POST también pueden
utilizar los vectores $HTTP_GET_VARS y $HTTP_POST_VARS. Consultar la ayuda de PHP para
más información.
Página 97/115
Iniciación a PHP 4 8.- FORMULARIOS
8.- FORMULARIOS
8.1.- Introducción
Hasta el momento hemos visto las estructuras para tratar y almacenar los datos del usuario,
pero aún no hemos visto la forma de recogerlos.
La obtención de datos está ampliamente desarrollada mediante los formularios HTML. Todos
estamos acostumbrado a los cajetines, áreas de texto y listas desplegables existentes en casi todas
las Webs y que permiten identificarnos, almacenar datos personales, escribir en foros, firmar libros de
visita, etc..
8.2.- Formularios
Aunque los formularios no forman parte de PHP si no de HTML, haremos un breve repaso a
los formularios y a sus entidades.
Creación Formularios
Aunque existen más atributos, los más importantes y los que utilizaremos nosotros son dos:
o action: Indica el nombre del script que procesará los datos del formulario. También es
válido poner action=”malito: gabmecu@inf.upv.es“ para que los datos sean enviados
directamente a una dirección de correo, aunque no todos los navegadores lo soportan.
Aquí es dónde nosotros pondremos el nombre del archivo PHP que se encargará de
procesar los datos.
o method: Método de envío de datos entre el formulario y el servidor. Puede tener dos
valores: GET y POST. El método GET (que ya hemos visto) envía los datos a través de la
URL mientras que el método POST envía los datos del formulario en el cuerpo de una
petición HTTP POST. El método GET tiene un gran inconveniente: la cantidad de
información que puede ser enviada está limitada al tamaño máximo de la URL que
navegador y servidor pueden manejar. Además, el método GET no soporta el envío de
caracteres que no sean ASCII (cómo "é" y"©"). El método POST siempre es más seguro y
más cómodo. Si se va a trabajar con URL’s de más de 100 caracteres o que contengan
caracteres no ASCII el uso del método POST es imperativo para evitar posibles
problemas.
o enctype: Indica el tipo de contenido que va a ser enviado por el formulario. A no ser que
se vayan a enviar ficheros, este atributo es innecesario. Si este fuera el caso, es
IMPRESCINDIBLE añadir este atributo y con el valor de arriba. Si no existe el atributo, o
si su valor es diferente a "multipart/form-data", los datos no serán enviados
correctamente.
Falta por añadir que dentro de una misma página podemos tener todos los formularios que
necesitemos.
Página 98/115
Iniciación a PHP 4 8.- FORMULARIOS
Entidades
Para la inserción de texto por parte del usuario disponemos de dos tipos de entidades: Text
Box (Cajetín de texto) y el Text area box (Cajetín con área de texto).
TEXT BOX
Sirve para entradas de texto cortas y de una sola línea. Su sintaxis es:
Para la selección de opciones mediante el uso del ratón disponemos de tres entidades:
Checkbox (Confirmación de una opción), Radio Button (Botones de Opción) y los Pull-Down Menu
(Listas desplegables).
CHECKBOX
Permite la confirmación de una determinada opción que se le muestra al usuario. Su sintaxis es:
Página 99/115
Iniciación a PHP 4 8.- FORMULARIOS
RADIO BUTTON
Permite la selección de una opción entre un grupo de opciones que son mostradas al usuario. Su
sintaxis es:
IMPORTANTE:
Si nos fijamos, la diferencia fundamental entre los cuadros de confirmación y los botones de
radio reside en que en el primero cada opción es independiente del resto y TODAS podrían estar
marcadas (cada cuadro de confirmación debe tener un nombre diferente con respecto al resto de
cuadros de confirmación), de ahí que todas puedan llevar el atributo checked.
En cambio, en la selección por opción, sólo se puede seleccionar UNA de las opciones
mostradas (todas las opciones del mismo grupo deben tener el mismo nombre), de ahí que sólo una
de las opciones del grupo pueda llevar el atributo checked.
PULL-DOWN MENU
Genera una lista desplegable de opciones. Su sintaxis es:
NOTA:
Si el número de opciones a mostrar es menor que el número total de opciones, al cuadro de
selección le aparecerá una barra de desplazamiento vertical.
Página 100/115
Iniciación a PHP 4 8.- FORMULARIOS
Más adelante veremos cómo PHP gestiona el envío de ficheros, de momento veremos qué
entidad suministra HTML para tal fin.
HIDDEN VALUES
La idea es poder mandar información, obtenida previamente, de un script a otro. Su sintaxis es:
Podemos añadir todas las entidades ocultas que nos interesen. Basta con poner nombres
distintos a cada entidad oculta.
Siempre que necesitemos enviar información poco importante entre scripts, podemos recurrir
al uso de estas entidades. Proporcionan un sencillo mecanismo para la persistencia de datos sin
tener que recurrir a cookies o variables de sesión.
ENTIDADES GENERALES
Para terminar, veremos dos entidades que permiten enviar los datos o reestablece el valor de
todas las entidades a sus valores por defecto: Submit (Envío de Datos) y Reset (Reestablecer
valores).
SUBMIT
Envía los datos de todas las entidades del formulario al script indicado en action. Su sintaxis es:
Página 101/115
Iniciación a PHP 4 8.- FORMULARIOS
RESET
Restaura el valor de todas las entidades a su valor por defecto. Su sintaxis es:
A parte de los atributos ya vistos, existe una atributo opcional común a TODAS las entidades
vistas: tabindex=”num_orden”.
Aunque no suele ser habitual que el usuario se desplace a través de la página mediante el
teclado (usando el tabulador), si este fuera el caso, cuando llegase al formulario el orden en el que se
recorrerán las entidades puede no ser el esperado.
Para evitar esto, podemos añadir a cada entidad el atributo tabindex. El número al que se iguala
este atributo indica el orden en que se recorrerá dentro del formulario.
NOTA:
Así como el botón de envío es imprescindible si queremos que los datos se envíen, el botón
de reestablecer es totalmente opcional.
Página 102/115
Iniciación a PHP 4 8.- FORMULARIOS
ejemplo_sencillo.php
<?php
// Sencillo ejemplo que muestra la interacción de PHP con HTML
if (isset($_POST["seenform"]))
{
echo "Nombre: ".$_POST["nombre"]."<br>\n";
echo "Apellidos: ".$_POST["apellido_1"]." ".$_POST["apellido_2"]."<br>\n";
echo "<a href='{$GLOBALS['PHP_SELF']}'>Volver al formulario</a>";
}
else
{
echo <<<FORM
<html>
<head>
<title>Formulario Simple</title>
</head>
<body>
<form method="POST" action="{$GLOBALS["PHP_SELF"]}">
Nombre: <input type="text" name="nombre" size="20"><br>
Apellido 1: <input type="text" name="apellido_1" size="20">
Apellido 2: <input type="text" name="apellido_2" size="20"></p>
<input type="hidden" name="seenform" value="TRUE">
<p>
<input type="submit" value="Enviar">
<input type="reset" value="Restablecer">
</p>
</form>
</body>
</html>
FORM;
}
?>
Página 103/115
Iniciación a PHP 4 8.- FORMULARIOS
Antes de explicar cómo gestiona PHP el envío de ficheros, es conveniente saber cómo
habilitar esta opción.
Para poder enviar ficheros al servidor (file uploads), tenemos que configurar el archivo php.ini
Si hacemos BUSCAR w FILE UPLOADS encontraremos las siguientes líneas:
1. ;;;;;;;;;;;;;;;;
2. ; File Uploads ;
3. ;;;;;;;;;;;;;;;;
En la línea 9 indicamos el tamaño máximo de los ficheros enviados (expresado en Mega Bytes).
Ya hemos visto que para enviar ficheros hacemos uso de la entidad file de HTML. El
tratamiento que PHP hace de esta entidad es bastante intuitivo: crea un archivo temporal en el
servidor y almacena la siguiente información dentro de los vectores globales $_FILES y
$HTTP_POST_FILES:
$HTTP_POST_FILES['fichero']['name'] ó $_FILES['fichero']['name']
El nombre original del fichero en la máquina cliente.
Donde fichero es el nombre que le dimos a la entidad HTML encargada del envío de ficheros.
$fichero: Nombre del fichero temporal que sirve para almacenar en el servidor el archivo recibido.
$fichero_type: El tipo mime del fichero (si el navegador lo proporciona). Un ejemplo podría ser
"image/gif".
Página 104/115
Iniciación a PHP 4 8.- FORMULARIOS
Disponemos de dos funciones interesantes para trabajar con ficheros que han sido subidos al
servidor:
is_uploaded_file($fichero_subido) para comprobar si un fichero ha sido subido al servidor mediante
el método POST.
Siempre que enviemos ficheros mediante el método POST (existe otro método llamado PUT
que no veremos) es conveniente agregar la siguiente entidad oculta antes de la entidad file:
Con ella es posible conseguir que el navegador haga una primera comprobación del tamaño del
fichero. Así como el navegador puede saltarse esta comprobación, hay que recordar que PHP tiene
configurado un tamaño máximo para los archivos enviados y rechazará aquellos que superen dicho
tamaño.
Hay que recordar que no se nos puede olvidar añadir el atributo enctype="multipart/form-
data" dentro de la etiqueta del formulario. Veamos un ejemplo completo:
enviar_fichero.html
<html>
<head>
<title>Envío de Ficheros</title>
</head>
<body>
<form enctype="multipart/form-data" action="recibe_fichero.php" method="post">
<!-- El navegador rechazará cualquier fichero que exceda de 1000 bytes,
independientemente del tamaño máximo configurado en php.ini -->
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
Enviar el siguiente archivo: <input name="fichero" type="file"><br>
<input type="submit" value="Enviar Fichero">
</form>
</body>
</html>
Página 105/115
Iniciación a PHP 4 8.- FORMULARIOS
recibe_fichero.php
<?php
// Nombre de la entidad HTML que nos envia el fichero
$nombre='fichero';
// Carpeta dónde moveremos el fichero recibido
$carpeta_destino='./ficheros_recibidos/';
$fich_destino=$carpeta_destino.$_FILES[$nombre]['name'];
También se permite el envío múltiple de ficheros. Para hacer esto, se utiliza la misma sintaxis
que cuando tenemos listas múltiples, es decir, basta con cambiar el nombre de “fichero” por el de
“fichero[]” en cada entidad “file” de HTML. Veamos un ejemplo:
enviar_varios_ficheros.html
<html>
<head>
<title>Envío de Ficheros</title>
</head>
<body>
<form action="recibe_varios_ficheros.php" method="post" enctype="multipart/form-data">
Enviar los siguiente ficheros:<br>
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
<input name="fichero[]" type="file" size="30"><br>
<input name="fichero[]" type="file" size="30"><br>
<input name="fichero[]" type="file" size="30"><br>
<input name="fichero[]" type="file" size="30"><br>
<input type="submit" value="Enviar Ficheros">
</form>
</body>
</html>
Página 106/115
Iniciación a PHP 4 8.- FORMULARIOS
recibe_varios_ficheros.php
<?php
// Nombre de las entidades HTML que nos envian los ficheros
$nombre='fichero';
// Carpeta donde moveremos el fichero recibido
$carpeta_destino='./ficheros_recibidos/';
$fich_destino=$carpeta_destino.$_FILES[$nombre]['name'][$i];
if (move_uploaded_file($_FILES[$nombre]['tmp_name'][$i], $fich_destino))
echo "SUBIDO<br>\n";
else
echo "NO subido<br>\n";
$num_fich_real++;
}
}
}
// Mostramos el número máximo de posibles ficheros enviados y el real.
echo "<br>"; // Línea en blanco
echo "Máximo número de Ficheros recibidos: <b>$num_fich_max</b><br>\n";
echo "Número real de Ficheros recibidos: <b>$num_fich_real</b><br>\n";
?>
Página 107/115
Iniciación a PHP 4 8.- FORMULARIOS
Hay que pensar que la creación dinámica de páginas web permite evitar la redundancia e
inconsistencia de los datos, sobre todo cuando se muestra información que es compartida y
modificada por diversos usuarios.
Vamos a ver un ejemplo que crea un formulario de forma totalmente dinámica, en función del
4
contenido de un fichero .ini de configuración:
4
Por razones de seguridad, se ha cambiado la extensión .ini a .php. Con un sencillo truco, evitamos que el
usuario pueda descargarse el contenido del archivo.
Página 108/115
Iniciación a PHP 4 8.- FORMULARIOS
formulario_dinamico.php
<?php
// Incluimos el archivo que contiene la función "crea_lista_desp($vect, $l_nombre)"
include("./func_crea_lista.php");
// Parseamos su contenido
$contenido=parse_ini_file($fich_conf, $secciones);
// Cerramos el formulario
echo "\n</form>\n";
?>
Página 109/115
Iniciación a PHP 4 8.- FORMULARIOS
func_crea_lista.php
<?php
// Creamos una función que crea una lista desplegable a partir de un vector.
// El vector debe contener tres componentes que configuran la lista:
// TEXTO (indica el texto de la lista), SELECCION (indica si se permite
// la selección múltiple) y TAMANYO (número de elementos a mostrar)
// El orden no importa.
// El resto de componentes son consideradas como los elementos de la lista
function crea_lista_desp($vect, $l_nombre)
{
// Sirve para contar el número de elementos
$i=0;
// Recorremos el vector
foreach($vect as $clave => $valor)
{
switch($clave)
{
case "TEXTO":
$l_texto=$valor;
break;
case "SELECCION":
$l_seleccion=$valor;
// Si la selección es múltiple, los datos han de guardarse
// en un vector
if ($l_seleccion=="multiple") $l_nombre.='[]';
break;
case "TAMANYO":
$l_tamanyo=$valor;
break;
default:
// Sólo el primer elemento estará seleccionado
if ($i==0) $sel_elem="selected";
else $sel_elem="";
// Agregamos un elemento a la lista
$l_elementos.="<option value='$valor' $sel_elem>$clave</option>\n";
// Incrementamos el número de elementos
$i++;
break;
}
}
// Ya tenemos toda la información de la lista. La mostramos por pantalla:
echo "$l_texto<br>\n";
echo "<select size='$l_tamanyo' name='$l_nombre' $l_seleccion tabindex='$l_numero'>\n";
echo $l_elementos;
echo "</select>\n";
9.- SESIONES
9.1.- Introducción
Hoy en día resulta extremadamente útil el poder hacer un seguimiento del usuario dentro de
nuestra web. Eso permite el poder mostrar información más personalizada atendiendo a los gustos de
nuestro usuario. Pensemos en sitios web que se encarguen de vender productos. Si tenemos una
tienda de libros y hacemos un seguimiento de los libros que consulta, podemos intuir los géneros que
le resultan más atractivos. De este modo, la próxima vez que nos visite, lo primero que le
mostraremos son las novedades y ofertas de los libros pertenecientes sus géneros favoritos.
A parte de las ventajas comerciales y de marketing, también tiene fines de privacidad. Por
ejemplo, podemos mostrar contenidos diferentes atendiendo al tipo de usuario que acceda a nuestra
web. Un ejemplo claro lo tenemos dentro de la web de la universidad.
Una forma sencilla de realizar este seguimiento es mediante las conocidas “cookies”
(galletas). Una cookie no es más que un pequeño fichero de texto que se envía desde el servidor al
navegador del usuario dónde se puede almacenar información. Esto permite que la información entre
usuario y servidor sea persistente. En la actualidad existen cientos de sitios que usan este sencillo
sistema para realizar compras on-line, crear webs personalizadas o mostrar publicidad selectiva.
Pese a ser un método sencillo, las cookies tienen algunos inconvenientes: pueden ser
desactivadas desde el explorador del usuario y, además, tienen un tamaño limitado (máximo
4KBytes). A parte de todo ésto, la información contenida puede no ser del todo fiable pues el usuario
tiene acceso a ella y puede, por tanto, manipularla.
PHP admite el uso de cookies de una forma extremadamente sencilla, pero añade otro
método mucho más flexible, potente y fácil para realizar el seguimiento del usuario: SESIONES.
El servidor guardará los datos de esa sesión creando un fichero (en el directo indicado por
session.save_path en php.ini ) cuyo nombre será el identificador de la sesión y cuyo contenido será
las variables que el usuario de dicha sesión vaya registrando.
El usuario siempre podrá acceder a sus variables de sesión registradas gracias a los vectores
$_SESSION y $HTTP_SESSION_VARS (en desuso). Si register_globals está activado, también se
podrán acceder de forma directa a las variables. Recordar que no se aconseja el uso de
register_globals debido a los problemas de seguridad y eficiencia.
NOTA: Se puede configurar PHP para que que cualquier script que se ejecute, inicie
automáticamente sesión. Eso se puede conseguir poniendo session.auto_start = 1 en el fichero
php.ini, aunque no es muy recomendable.
Cuando el usuario haya acabado de usar nuestra web, basta con que cierre su sesión de
para que las variables registradas sean borradas y el fichero en el servidor también sea destruido. La
cookie (si se ha usado) no se destruirá por el hecho de cerrar la sesión, aguantará el tiempo que esté
configurado en session.cookie_lifetime. Si su valor es 0, indica que el tiempo de vida de la cookie
expira cuando se acabe la sesión. Es lo que suele estar puesto por defecto.
Página 111/115
Iniciación a PHP 4 9.- SESIONES
Para iniciar una sesión, basta con llamar a la función session_start(). Crea una sesión o
continúa una existente basandose en el session id pasado por GET o mediante una cookie. Antes de
trabajar con sesiones, siempre hemos de llamar a esta función.
NOTA: session_start() siempre devuelve TRUE, por tanto no tiene sentido usarla dentro de
sentencias condicionales.
Las sesiones también tienen un nombre. Es utilizado para albergar el valor del identificador de
sesión en cookies y URL’s. Por ejemplo, si tenemos desactivadas las cookies en nuestro explorador y
hemos iniciado sesión, cuando cambiemos de script veremos algo similiar a lo siguiente:
http://localhost/public/9-
sesiones/ejemplo_sencillo/mod_sesion.php?PHPSESSID=b51fb8d0c0c1b57eba42876a157e8823
Si nos interesara cambiar el nombre por defecto, lo podemos realizar cambiando el atributo
session.name en el fichero de configuración (que por defecto vale PHPSESSID).
Registrar variables es un proceso sencillo, pues sólo tenemos que ir creando elementos
dentro del vector superglobal $_SESSION (o $HTTP_SESSION_VARS).
$_SESSION[‘vect_usuario’]=$vect_usuario;
Si queremos saber si una variable está registrada en la sesión usamos la función isset(), tal y
cómo hacemos habitualmente cuando queremos conocer la existencia de una variable.
Borrar una variable de la sesión es igual de fácil que cuando borrábamos elementos de un
vector. Hay que hacer una llamada a la función unset():
5
Si se llama a session_name() para cambiar el nombre de la sesión antes de haberla iniciado, el intérprete
considerará que lo que queremos hacer es crear una nueva sesión, con lo que perderemos los datos de la sesión
anterior y crearemos una sesión nueva (y con distinto identificador, evidentemente).
Página 112/115
Iniciación a PHP 4 9.- SESIONES
Al estar register_globals activado, se puede acceder y modificar las variables de sesión como si de
variables locales se tratasen, aunque si se trata de acceder a ellas dentro de alguna función o un
método habrá que poner delante la palabra reservada GLOBAL.
No vamos a ver cómo manejar las variables de sesión mediante estas funciones. Como ya se ha
comentado antes, no es conveniente trabajar con register_globals activado y si lo está, trabajaremos
como si no lo estuviese.
Destruir una sesión pasa por dos simples pasos: llamar a la función session_unset() que se
encarga de borrar todas las variables de sesión, y seguidamente llamar a session_destroy() que
destruye la sesión y borra el archivo del servidor que almacenaba los datos de la sesión.
Cada vez que una sesión es destruida, sus datos son borrados. Si deseamos no perder los
datos de la sesión, PHP nos suministra dos funciones: session_encode() y session_decode(). La
primera codifica todos los datos de la sesión en una cadena de caracteres que puede ser almacenada
en una base de datos o en un fichero. La segunda realiza el procedimiento inverso: se le pasa una
cadena codificada y restaura su contenido creando las variables necesarias en la sesión actual. La
función devuelve TRUE si todo ha ido bien y FALSE en caso contrario.
Es evidente que esto puede resultar extremadamente útil si queremos que el usuario continúe
con la sesión anterior. Por ejemplo, imaginemos que tenemos una tienda electrónica y que vendemos
discos. Si el usuario había metido 4 discos en el carrito de la compra pero no se había decidido a
comprarlos, es interesante que la próxima vez que inicie sesión en nuestra tienda, le dejemos el
carrito tal y como estaba.
< ?php
// Iniciamos sesión
session_start();
Página 113/115
Iniciación a PHP 4 9.- SESIONES
session_decode($datos_sesion);
// Destruimos la sesión
session_unset();
session_destroy();
?>
Veamos a continuación un ejemplo general que ilustra el manejo completo de las sesiones:
crear_sesion.php
<?php
// Script que crea una sesión y registra una serie de variables dentro de ella
session_start();
$_SESSION['nombre']="Gabriel";
$_SESSION['mail']="gabmecu@inf.upv.es";
mod_sesion.php
<?php
// Script que continúa con la sesión anterior. Le cambia el nombre de la sesión
// y muestra las variables registradas en la sesión.
session_start();
session_name("GANDALF_WebSite");
Página 114/115
Iniciación a PHP 4 9.- SESIONES
del_sesion.php
<?php
// Este script sólo se encarga de guardar los datos de la sesión en un fichero
// y destruir la sesión actual.
session_start();
rebuild_sesion.php
<?php
// Script que inicia sesión y trata de restaurar los datos de la sesión anterior
// contenidos en el fichero sesion.dat
session_start();
Página 115/115