You are on page 1of 124

MÓDULO 2

UNIDADES DIDÁCTICAS:

3. Más funciones del lenguaje PHP

4. Operaciones con ficheros y directorios

5. Control de usuarios y gestión de sesiones


 
MÓDULO 2

Más funciones del lenguaje PHP

Unidad 3

Índice de la unidad:

1. Tratamiento de cadenas de caracteres

2. Tratamiento de fechas

3. Tratamiento de matriculas

4. Funciones creadas por el usuario

5. La programación orientada a objetos (POO)

6. Resumen
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Introducción
En esta Unidad vamos a conocer y saber aplicar correctamente las
principales funciones para tratar cadenas de caracteres.

Practicaremos con las principales funciones para tratar y formatear fechas.

También, aprenderemos a crear e inicializar matriz aplicándolas con


eficiencia a las diferentes situaciones que lo requieran.

Además, estudiaremos en profundidad cómo definir y utilizar Objetos.

Finalmente, veremos cómo definir funciones de usuario.

Tratamiento de cadenas de caracteres


En las dos Unidades anteriores hemos usado frecuentemente cadenas de
caracteres. Hasta el momento sólo hemos escrito los textos entre comillas sin
darle mayor importancia y los hemos mostrado en las páginas web tal como los
habíamos escrito en el código.

En este apartado de la Unidad 3 vamos a abordar con mayor detalle las


diferentes operaciones que se pueden llevar a cabo con este tipo de datos
estudiando las principales funciones que permiten hacerlo.

En la Unidad 1 ya estudiamos las funciones echo, print y printf, por lo cual en


ésta no vamos a repetir las explicaciones dadas.

En el Manual de PHP aparecen más de 80 funciones de cadena de caracteres.


En este apartado nos vamos a limitar a explicar brevemente las más frecuentes
y necesarias. Nuestro objetivo es que el alumno aprenda a utilizar algunas para
familiarizarse con ellas y poder, luego, utilizar correctamente las que necesite
obteniendo información en el Manual.

Adaptar las cadenas al contexto

Al mezclarse el código HTML y PHP es preciso ocasionalmente que el


intérprete sepa distinguir los signos propios de cada lenguaje que puedan
aparecer en el interior de una cadena. Las funciones que permiten adaptar el
contenido de una cadena al contexto de cada código son las siguientes:

La función addSlashes() devuelve una cadena con barras invertidas delante de


los caracteres que necesitan marcarse en consultas de bases de datos y en
otras operaciones en las que intervienen esos caracteres. Nos estamos
refiriendo a la comilla simple ('), a la comilla doble ("), a la barra invertida (\) y
a NUL (byte nulo).

- 155 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La forma de proteger estos caracteres, para que no sean interpretados por el


Shell o por PHP como caracteres significativos, es poner una barra invertida
(Slash) delante de los mismos.

Por ejemplo, si a la variable $consulta le asignamos el valor "WHERE nom =


‘Ana’", las comillas simples interiores serán interpretadas como caracteres
significativos, pero necesitamos que sean interpretados como comillas. Así
pues, con la función addSlashes() lo conseguimos de esta forma:

// Así la variable $consulta contendrá WHERE nom = ‘Ana’


$consulta="WHERE nom = 'Ana'";

// Así la variable $consulta contendrá WHERE nom = \‘Ana\’


$consulta=addSlashes($consulta);

La función stripSlashes() devuelve una cadena sin barras invertidas delante


de la comilla simple ('), la comilla doble ("), la barra invertida (\) y el valor
NULL. Esta función, pues, realiza la función inversa de la función anterior.

Siguiendo con el ejemplo anterior podemos usarla de esta forma:

// Así la variable $consulta contendrá WHERE nom = 'Ana'


$consulta="WHERE nom = 'Ana'";

// Así la variable $consulta contendrá WHERE nom = \'Ana\'


$consulta=addSlashes($consulta);

// Así la variable $consulta contendrá WHERE nom = 'Ana'


$consulta=stripSlashes($consulta);

En la Unidad 2, dentro del apartado Lectura de datos desde una página web,
ya nos hemos referido a la función urlencode(), que preserva los espacios de
un texto para que HTML los respete como tales. Veamos ahora con mayor
detalle esta función y su contraria.

La función urlencode()devuelve una cadena en la que todos los caracteres no


alfanuméricos, excepto -, _, y., son reemplazados por un signo de porcentaje
(%) seguido por dos dígitos hexadecimales. Los espacios son sustituidos por
signos positivos (+). Es conveniente usar esta función para escribir una cadena
de texto que va a ser usada dentro del código HTML que forma parte de una
URL (dirección web). También es una forma adecuada de pasar variables a la
página siguiente. Lo más frecuente es que la usemos para que HTML respete
los espacios en blanco que haya dentro del texto.

Veamos en un ejemplo cómo se producen las conversiones:

$b='<A HREF = _ - "Poñw?.jura 1 ) # & //';


echo $b."<P>";
/* Aquí se muestra la misma cadena que hemos
escrito entre comillas simples. */
echo urlencode($b);

- 156 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

/* Aquí se muestra la cadena %3CA+HREF+%3D+_+-


++%22Po%F1w%3F.jura+1+%29+%23+%26+%2F%2F */

Conviene observar que los espacios se representan con el signo +, las letras,
excepto la ñ, y los números se dejan igual, y los demás signos, como <, =, ),
etcétera, son sustituidos por el signo % seguido de dos dígitos en base
hexadecimal.

La función urldecode()realiza la operación inversa de la anterior. Por ejemplo,


si escribimos las instrucciones

$c='SELECT+ALL+FROM+tabla+WHERE+nombre%3D%22JUANA%22';

$d=urldecode($c);

echo $d."<P>";

la página muestra la cadena original

SELECT ALL FROM tabla WHERE nombre="JUANA"

Las funciones rawurlencode() y rawurldecode() (código puro para URL) se


comportan prácticamente igual que las dos anteriores, con la diferencia de que
éstas no convierten en código HTML las letras, los números y el carácter de
subrayado (_), pero sí codifican en el mismo los signos -, y. Usando las
primeras se consiguen efectos más amplios, por lo que recomendamos su uso
preferente.

La función nl2br() se utiliza también para dar formato a las salidas en HTML.
Esta función transforma los códigos de salto de línea de los ficheros de texto en
códigos de salto de línea propios de HTML conservando los anteriores. Se
utiliza principalmente para organizar el texto introducido en TEXTAREA de un
formulario. Cambia, pues, la orden \n (salto de línea en un fichero de texto) en
<br> (salto de línea en código HTML) produciendo un salto de línea real, tanto
en el código HTML devuelto al interpretarse el código PHP como en la página
web que se muestra.

Por ejemplo, si escribimos las siguientes instrucciones

$frase="Primero \n Segundo \n Tercero";


echo "<br> \n";
echo "Sin aplicar saldo de línea HTML: \"$frase\"";
echo "<br> \n";
$frase=nl2br($frase);
echo "Aplicando salto de línea HTML: \"$frase\"";

se devuelve al siguiente código HTML

<HTML>
<HEAD></HEAD>
<BODY>
<br>

- 157 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Sin aplicar salto de línea HTML: "Primero

Segundo

Tercero"<br>

Aplicando salto de línea HTML: "Primero <br>

Segundo <br>

Tercero"

</BODY>
</HTML>

y se genera la siguiente página:

Sin aplicar saldo de línea HTML: "Primero Segundo Tercero"


Aplicando salto de línea HTML: "Primero
Segundo
Tercero"

Se puede observar que los saltos de línea del fichero de texto \n mediante la
función nl2br() han sido sustituidos en el código HTML por saltos de línea
<br>.

Limpiar cadenas de caracteres

La función chop() elimina los espacios en blanco que haya al final de una
cadena de caracteres, incluyendo los códigos de fin de línea si los hubiere.

Por ejemplo, las instrucciones

$f="La ciencia es un conjunto de verdades \n ";


$g=chop($f);
echo "La variable \$f contiene ".strlen($f)."
caracteres de los que ".(strlen($f)-strlen($g)).
"son espacios en blanco o saltos de línea.<P>";
echo "En cambio, si usamos la función chop()
la variable \$f contiene sólo ".strlen($g).
"caracteres.<P>";

generan la página siguiente:

La variable $f contiene 44 caracteres de los que 7 son espacios en


blanco o saltos de línea.

En cambio, si usamos la función chop() la variable $f contiene sólo 37


caracteres.

Algo más abajo se verá que la función strlen() devuelve el número de


caracteres que tiene una cadena.

- 158 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La función ltrim() elimina los espacios en blanco que haya al principio de una
cadena de caracteres.

Por ejemplo, las instrucciones

$h=" La ciencia es un conjunto de verdades";

$i=ltrim($i);

echo "La variable \$h contiene ".strlen($h)." caracteres


de los que ".(strlen($h)-strlen($i))."son espacios
en blanco.<P>";

echo "En cambio, si usamos la función ltrim() la variable


\$i contiene sólo ".strlen($i)." caracteres.<P>
Ha perdido los espacios en blanco iniciales.<P>";

generan la página siguiente:

La variable $h contiene 42 caracteres de los que 5 son espacios en


blanco.

En cambio, si usamos la función ltrim() la variable $h contiene sólo


37 caracteres.

Ha perdido los espacios en blanco iniciales.

La función trim() es una combinación de las dos anteriores: elimina los


espacios en blanco que haya al principio y al final de una cadena.

Por ejemplo, si $limpia contiene " casa ", la instrucción echo trim($limpia)
devuelve "casa".

La función strip_tags() elimina los controles HTML de una cadena. Por


ejemplo, las instrucciones siguientes:

$quita_html="<H1>Texto grande</H1> <B>Negrita</B><P>";


echo $quita_html."<P>";
echo strip_tags($quita_html);

generan esta página

Texto grande
Negrita  

Texto grande Negrita

Puede observarse que en el primer echo se ejecutan los códigos HTML. En


cambio, en el segundo, al eliminarse estos controles con strip_tags(), se
muestra el texto sin ellos.

- 159 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Letras mayúsculas y letras minúsculas

Algunas funciones permiten convertir todos o sólo algunos caracteres de una


cadena en mayúsculas o minúsculas según nos convenga. Son muy fáciles de
usar. Resumimos las más importantes.

Función strtoupper(): devuelve la misma cadena convirtiendo todos sus


caracteres en mayúsculas.

Ejemplo: si $a contiene "Pepe", echo strtoupper($a); devuelve "PEPE".

Función strtolower(): devuelve la misma cadena convirtiendo todos sus


caracteres en minúsculas.

Ejemplo: si $M contiene "PEPe", echo strtolower($M); devuelve "pepe".

Función ucfirst(): devuelve la misma cadena convirtiendo su primer carácter


en mayúscula si es una letra.

Ejemplo: si $M1 contiene "diosa", echo ucfirst($M1); devuelve "Diosa".

Para que esta función tenga en cuenta el alfabeto completo español en


mayúsculas, sobre todo si las letras tienen tilde, como "Águila", hay que
establecer su configuración previamente con la función setlocale
(LC_ALL,"spanish");. Estos valores son los formatos de hora, moneda,
alfabeto, separador de decimales, etcétera.

Función ucwords(): devuelve la misma cadena convirtiendo el primer carácter


de todas las palabras en mayúscula.

Ejemplo: si $M_pal contiene "diosa de la antigüedad egipcia", la instrucción echo


ucwords($M_pal); devuelve "Diosa De La Antigüedad Egipcia".

Conocer la longitud de una cadena

Función strlen(): devuelve la longitud de una cadena expresada en valor


numérico entero. Cuenta todas las posiciones, aunque sean espacios en
blanco. Ya hemos visto cómo se usa en las funciones chop(), ltrim() y
trim().

Ejemplo: si $largo contiene "diosa de la antigüedad egipcia", la instrucción echo


strlen($largo); devuelve el valor numérico 30.

Repetir una cadena

Función str_repeat(): devuelve la misma cadena que toma como primer


argumento repetida tantas veces como se indique en el segundo argumento.

- 160 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Ejemplo: si $repe contiene "diosa<P>", echo str_repeat($repe,3); devuelve la


cadena "diosa" repetida tres veces en distintas líneas.

Modificar algunos caracteres de una cadena

Función strtr(): devuelve la misma cadena sustituyendo los caracteres de la


misma que se indiquen en el segundo argumento por los que se indiquen en el
tercer argumento haciéndolos equivaler uno a uno.

Ejemplo: si $cambia contiene "Los días perdidos en verano" y necesitamos


sustituir las as por us y las os por as, podemos escribir la sentencia siguiente:
echo strtr($cambia,"ao","ua"); La función devolverá la cadena "Las díus
perdidas en veruna".

También existe la función str_replace() que reemplaza todas las apariciones


del string buscado con el string de reemplazo.

Ejemplo: si $frase contiene " Deberías comer pizza, refrescos, y helado todos
los días." y necesitamos sustituir la comida no saludable por saludable,
podemos escribir las sentencias siguientes:

$frase = "Deberías comer pizza, refrescos, y helado todos los días.";


$saludable = array("fruta", "vegetales", "fibra");
$no_saludable = array("pizza", "refrescos", "helado");

$nueva_frase = str_replace($no_saludable, $saludable, $frase);

La función devolverá la cadena " Deberías comer fruta, vegetales, y fibra todos
los días.".

Esta función tiene los siguientes parámetros str_replace (mixed $search,


mixed $replace, mixed $subject [, int &$count ] ), donde:

 search: cadena buscada, también conocida como la aguja (por el dicho


del pajar). Se trata de una matriz donde podemos incluir varias cadenas.
 replace: cadena de reemplazo que sustituye los valores encontrados de
search. Igualmente, podemos definir una matriz para reemplazar con
cadenas diferentes.
 subject: cadena o matriz sobre la que se busca y se sustituye, también
conocido como el pajar. Si subject es una matriz, entonces la búsqueda
y reemplazo se realiza con cada elemento de esta matriz subject y el
valor devuelto también es otra matriz.
 count: parámetro opcional que establece el número de reemplazos que
se realizarán.

Esta función es utiliza mucho en la programación de PHP, por lo que


recomendamos al alumno o alumna que analice en detalle el ejemplo
anterior.

- 161 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Buscar dentro de las cadenas

Hay funciones que permiten buscar dentro de una cadena. No se usan con
frecuencia, por lo cual quien lo necesite puede obtener información en el
Manual sobre las mismas. Nos limitamos a enumerar las principales y a indicar
para qué sirven:

 strcspn(): devuelve el número del primer carácter de la primera cadena


(primer argumento) que encuentre en la segunda cadena (segundo
argumento). Se cuenta desde 0 en adelante.
 strspn(): devuelve el número de caracteres iniciales de la cadena
pasada como primer argumento que aparecen en la cadena pasada
como segundo argumento comparando de ésta sólo los caracteres que
coincidan consecutivamente.
 strpos(): devuelve el número de la posición del primer carácter de la
primera cadena (primer argumento) que coincida con la segunda cadena
completa (segundo argumento). Se cuenta desde 0 en adelante. Admite
un tercer argumento, que es el número a partir del cual debe buscarse el
texto de la segunda cadena en la primera.
 strrpos(): devuelve el número de la posición del último carácter de la
primera cadena (primer argumento) que coincida con la segunda cadena
completa (segundo argumento). Se cuenta desde 0 en adelante. A partir
de PHP 5 admite un tercer argumento, que es el número (siempre
negativo) a partir del cual debe buscarse el texto de la segunda cadena
en la primera.
 strrchr(): devuelve la subcadena que comprende el fragmento de la
primera cadena (primer argumento) que va desde la última aparición del
carácter pasado como segundo argumento hasta el final de la primera
cadena.
 strstr(): devuelve una subcadena de la cadena pasada como primer
argumento que comprende desde la primera aparición de la cadena
pasada como segundo argumento hasta el final de la primera cadena.

Operaciones con subcadenas

La función substr() devuelve una subcadena de la cadena que se pasa como


primer argumento. Esta subcadena contiene los caracteres de la cadena desde
la posición que se indica en el segundo argumento, que debe ser un número
entero, hasta el número que se indique en el tercer argumento.

Por ejemplo, echo substr("Memorias de África",3,4) devuelve la subcadena


"oria". Conviene observar que la cuenta empieza desde 0.

La sintaxis de esta función puede ser variada:

 Sin tercer argumento: se devuelve desde la posición inicial hasta el final.

- 162 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

 Con un segundo argumento negativo: se devuelve desde el final de la


cadena tantos caracteres como se indique en ese número negativo.
 Con un segundo argumento negativo y un tercero positivo: se devuelven
tantos caracteres como se indique en el tercer argumento desde la
posición del final de la cadena que se indique en el segundo argumento.

La función substr_replace() sustituye una subcadena de la cadena que se


pasa como primer argumento con la subcadena que se pasa como segundo
argumento desde la posición de inicio que se pasa como tercer argumento
tantos caracteres como se indique en el cuarto argumento. Propia de PHP 5.

Por ejemplo,

echo substr_replace("Memorias de África","en",8,2) devuelve la cadena


como "Memorias en África".

En la sintaxis de esta función también pueden darse varias circunstancias:

 Con un tercer argumento negativo: se cambian los caracteres contando


desde el final de la cadena.
 Con cuarto argumento negativo: la nueva cadena estará formada por el
texto del segundo argumento desde la posición del tercer argumento
más los caracteres especificados en el cuarto argumento contado desde
el final de la cadena.
 Sin cuarto argumento: la nueva cadena estará formada por el texto del
segundo argumento desde la posición del tercer argumento más los
caracteres previos a la posición del tercer argumento.

La función strtok() separa una cadena de texto (primer argumento) en


bloques según el separador indicado en el segundo argumento.

La función parse_str() trata una cadena de caracteres como si su información


se pasase a otra página mediante la URL. Conviene observar que esa cadena
debe tener el formato adecuado. Por ejemplo, las sentencias:

$variables="nom=Nacho&ape1=Roa&ape2=Bastos",

parse_str($variables);

define las variables $nom, $ape1 y $ape2, y les asigna los valores "Nacho", "Roa"
y "Bastos", respectivamente. Así puede pasarlas a otra página.

Invertir el texto de una cadena

La función strrev() recibe una cadena de caracteres y la devuelve al revés.

Por ejemplo, la sentencia echo strrev("paseo"); devuelve "oesap".

Comparar cadenas

- 163 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La función strcasecmp() compara dos cadenas pasadas como argumentos sin


distinguir entre letras mayúsculas y minúsculas y devuelve un número entero,
que es un cero si son iguales, un número mayor que cero si la primera es
mayor que la segunda y un número menor que cero si la primera es menor que
la segunda.

Por ejemplo, la instrucción strcasecmp("ABC","abc") devuelve 0, la instrucción


strcasecmp("CAB","abc") devuelve 2 y la instrucción strcasecmp("ABC","cab")
devuelve -2.

Al estudiar los operadores de comparación en la Unidad 1 se explicó cómo se


comparan los datos de tipo cadena.

La función strcmp() compara dos cadenas pasadas como argumentos


distinguiendo entre letras mayúsculas y minúsculas y devuelve los mismos
valores que la función anterior con la salvedad indicada. En el mismo ejemplo
anterior, las tres instrucciones siempre devolverían 2.

Otras funciones de cadena útiles

La función chr()recibe un número entero y devuelve el carácter


correspondiente del código ASCII.

Por ejemplo, echo chr(65); devuelve la letra A mayúscula.

La función ord()recibe un carácter del código ASCII y devuelve el número


entero correspondiente.

Por ejemplo, echo ord("A"); devuelve el número 65.

La función number_format() permite formatear un número como nos convenga.


Recibe un número de coma flotante como primer argumento y devuelve una
cadena con un determinado número de decimales fijado en el segundo
argumento, separado de la parte entera por un signo especificado en el
argumento tercero y un separador de los miles que se fija en el argumento
cuarto.

Por ejemplo, si la variable $numero contiene el valor 1234.5678 (el punto es el


separador decimal), la instrucción echo number_format($numero,3,",",".");
devuelve la cadena 1.234,567.

Es importante saber cómo están definidos los valores de configuración local de


PHP para los puntos decimales. En la función siguiente se explica este asunto.

La función setlocale() establece los valores de distintas categorías que


pueden ser diferentes para distintas configuraciones locales, como la
conversión y clasificación de caracteres en los diversos idiomas, los
separadores de decimales, el formato de fecha y hora, así como la
comparación de cadenas y de monedas.

- 164 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Por ejemplo, la instrucción setlocale(LC_ALL,"spanish") fija todas las


categorías disponibles (LC_ALL: conversión y clasificación de caracteres en los
diferentes idiomas, separadores de decimales y formato de fecha y hora) para
el entorno español, que en la mayoría de las categorías es igual al europeo.

La función str_split()convierte una cadena en una matriz. Como segundo


argumento en esta función podemos indicar el número de caracteres que
queremos usar.

Por ejemplo, $matriz= str_split("esto es así", 3); devuelve la matriz:


$matriz= Array ( 0 => "est", 1 => "o e", 2 => "s a", 3 => "sí" ).

La función strpbrk() busca en una cadena cualquier carácter de otra y


devuelve la subcadena desde la posición.

Por ejemplo, echo strpbrk("Esto es una prueba", 'po'); devuelve el


resultado:
"o es una prueba" porque primero encuentra el carácter "o" antes que "p".

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 1 (Tratamiento


de cadenas) de la Unidad 3. Estudia el código fuente y ejecútalo para
mostrar en el navegador su resultado.

En este programa se incluye la mayoría de los ejemplos cuyo código hemos ido
escribiendo junto a las funciones explicadas y otros nuevos que no aparecen
en el texto anterior. Es importante que lo estudies en detalle.

- 165 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Tratamiento de fechas

El uso de fechas es muy frecuente e imprescindible en Internet. PHP dispone


también de funciones para tratar y obtener fechas. En este segundo apartado
vamos a estudiar las más importantes y necesarias, así como su aplicación en
las páginas web.

Comprobar la validez de una fecha

La función checkdate() nos permite comprobar si una fecha, que se pone


como argumento, es válida. Si lo es, la función devuelve el valor True
(verdadero). En el caso contrario, devuelve False (falso).

Se considera como válida una fecha cuando su año está comprendido entre los
años 0 y el 32767, su mes entre 1 y 12, y su día entre 1 y 28 para febrero no
bisiesto, 29 para febrero bisiesto, 30 para abril, junio, septiembre y noviembre,
y 31 para el resto de los meses. Así pues, esta función controla los años
bisiestos al comprobar la validez de una fecha.

La sintaxis de esta función es checkdate(mes,día,año); donde los tres


parámetros son números enteros. Conviene observar el orden en que deben
introducirse los parámetros, ya que no coinciden con la posición habitual de
nuestras fechas (día,mes,año)

Por ejemplo, la instrucción checkdate(0,25,2000); devuelve False. En cambio


la instrucción checkdate(7,25,2000); devuelve True.

Dar formato a una fecha y una hora

La función date() devuelve una cadena de texto que refleja una fecha y una
hora formateadas como se indique en el primer parámetro. En el segundo
argumento puede indicarse la fecha que se quiere mostrar utilizando un valor
de tipo timestamp (instante calculado como número de segundos transcurridos
desde el 1/1/1970, época UNIX). Si no se especifica este segundo parámetro,
se muestra la hora actual.

La sintaxis de esta función es:

date(cadena de formato, número entero del instante o nada);

Tabla de caracteres y su significado en la cadena de formato

Signo Descripción de su resultado en la página web


a "am" o "pm"
A "AM" o "PM"
día del mes, dos dígitos con cero a la izquierda; es decir, de "01" a
d
"31"

- 166 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

D día de la semana, en texto, con tres letras; por ejemplo, "Fri"


F mes, en texto, completo; por ejemplo, "January"
h hora, de "01" a "12"
H hora, de "00" a "23"
g hour, sin ceros, de "1" a "12"
G hour, sin ceros; de "0" a "23"
i minutos; de "00" a "59"
j día del mes sin cero inicial; de "1" a "31"
l día de la semana, en texto, completo; por ejemplo, "Friday"
L "1" or "0", según si el año es bisiesto o no
m mes; de "01" a "12"
n mes sin cero inicial; de "1" a "12"
M mes, en texto, 3 letras; por ejemplo, "Jan"
s segundos; de "00" a "59"
sufijo ordinal en inglés, en texto, 2 caracteres; por ejemplo, "th",
S
"nd"
t número de días del mes dado; de "28" a "31"
U segundos desde el valor de 'epoch'
w día de la semana, en número, de "0" (domingo) a "6" (sábado)
Y año, cuatro cifras; por ejemplo, "1999"
y año, dos cifras; por ejemplo, "99"
z día del año; de "0" a "365"
Z diferencia horaria en segundos (de "-43200" a "43200")

Conviene observar que esta cadena no utiliza categorías locales, por lo cual los
nombres de los días y los meses aparecen en inglés. Para formatear una fecha
y mostrar su resultado, es mejor utilizar la función strftime(), que se explica
después.

Extraer información de una fecha

La función getdate() se usa para extraer información de una fecha dada.


Tampoco admite categorías locales y, por tanto, la información literal está en
inglés.

La sintaxis de esta función es:

getdate(número entero del instante);

El instante es un número referido a los segundos transcurridos desde el día


1/1/1970 hasta la fecha. La información obtenida se almacena en un array
cuyos índices son los siguientes:

1. “seconds”: número de segundos

2. “minutes”: número de minutos

- 167 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

3. “hours”: número de horas

4. “mday”: día del mes

5. “mon”: número de mes

6. “year”: año

7. “yday”: día del año

8. “weekday”: nombre del día de la semana

9. “month”: nombre del mes.

Por ejemplo, la instrucción $fecha=getdate(); asigna al array $fecha los nueve


contenidos indicados antes.

La función mktime() se usa para extraer el valor timestamp de una fecha.


Después, podemos utilizar este valor como argumento de otros funciones. El
término timestamp se refiere al momento exacto de una fecha concreta
expresado en segundos desde el día 1 de enero de 1970 (época UNIX). Esta
función nos permite hallar el número de segundos que han transcurrido desde
entonces hasta la fecha que especifiquemos.

La sintaxis de esta función es

mktime(horas,minutos,segundos,mes,día,año);

Por ejemplo, si queremos saber el momento timestamp del día 16 de diciembre


de 1999, a las 10 horas, 15 minutos y 20 segundos, debemos escribir la
instrucción $momento=mktime(10,15,20,12,16,1999);. El resultado es
945339320.

Ahora podemos dar este número como argumento de la función getdate() y


obtenemos la misma fecha que le dimos a mktime(). Esta función es, además,
muy útil para comprobar fechas y compararlas.

Dar formato a una fecha traduciendo los nombres

La función strftime() se usa para formatear una fecha teniendo en cuenta las
especificaciones y categorías locales. Así soslayamos los problemas de este
tipo que plantean las funciones date() y getdate().

La sintaxis de esta función es

strftime(cadena de formato,instante);

Si no se proporciona el segundo parámetro, que es el número de segundos, se


toma la hora del sistema. Veamos ahora los signos de la cadena de formato y
sus resultados en la presentación de una fecha.

- 168 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Tabla de caracteres y su significado en la cadena de formato

Signo Descripción de su resultado en la página web


%a nombre del día de la semana abreviado
%A nombre del día de la semana completo
%b nombre del mes abreviado
%B nombre del mes completo
%c representación de fecha y hora preferidas en el idioma actual
%d día del mes en número (de 00 a 31)
%H hora como un número de 00 a 23
%I hora como un número de 01 a 12
%j día del año como un número de 001 a 366
%m mes como un número de 01 a 12
%M minuto en número
‘am’ o ‘pm’, según la hora dada, o las cadenas correspondientes en
%p
el idioma actual
%S segundos en número
número de la semana en el año, empezando con el primer domingo
%U
como el primer día de la primera semana
número de la semana en el año, empezando con el primer lunes
%W
como el primer día de la primera semana
%w día de la semana en número (el domingo es el 0)
%x representación preferida de la fecha sin la hora
%X representación preferida de la hora sin la fecha
%y año en número de 00 a 99
%Y año en número de cuatro cifras
%Z nombre o abreviatura de la zona horaria
%% carácter '%'

Si queremos que los nombres aparezcan en castellano, aquí sí podemos incluir


en el script la instrucción setlocale(LC_ALL,"spanish"); para traducirlos.

Más funciones de fecha

La función idate() se usa para obtener el número entero de una fecha según el
formato escrito en el primer parámetro.

Por ejemplo, si queremos saber el momento el número del año actual,


debemos escribir la instrucción echo idate('y');. El resultado es 5.

La función date_sunset() y date_sunrise() se usa para obtener la hora de la


puesta de sol y amanecer respectivamente para un día y ubicación
determinados.

- 169 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Leer una fecha desde una página web

Ésta es una de las operaciones más frecuentes en Internet. La mejor forma de


leer una fecha desde una página web es utilizar un formulario. A partir de esa
información con la función time() obtenemos una fecha, comprobamos si es
correcta y le damos el formato que sea necesario con la función strftime(). Si
los nombre de los días o de los meses aparecen en inglés, ya sabemos que
con la instrucción que hemos citado antes
setlocale(LC_ALL,identificador_local); podemos hacer que se muestre en
el idioma que queramos.

Mediante Eclipse PDT puedes abrir el proyecto Ejemplo 2 (Tratamiento


de fechas) de la Unidad 3. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

En este programa se incluye la mayoría de los ejemplos cuyo código hemos ido
escribiendo junto a las funciones explicadas y otros nuevos que no aparecen
en el texto anterior. Te invitamos a que lo estudies en profundidad.

- 170 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Tratamiento de matrices

Una matriz es una tabla cuadrada o rectangular de datos (llamados elementos


o entradas de la matriz) ordenados en filas y columnas, donde una fila es cada
una de las líneas horizontales de la matriz y una columna es cada una de las
líneas verticales de la matriz.

Hemos visto que una variable tiene un nombre que debe iniciarse por el signo
dólar ($) y un valor de uno de los tipos que soporta PHP. Pero en una variable
sólo podemos introducir un valor. ¿Hay alguna forma de asignar más de un
valor a un identificador? Sí, pero hay que usar matrices (arrays), que son
conjuntos de datos de diferentes tipos que se asignan a un solo nombre.

Un array o matriz se caracteriza por tres cosas:

• Está integrado por múltiples elementos (elements).

• Tiene un índice (key o index) para referirse a cada uno de sus elementos.
Este índice, también llamado subíndice, puede ser de tipo numérico entero o de
tipo cadena. En PHP el índice del primer elemento tiene el valor 0, si es de tipo
numérico entero.

• Cada elemento tiene un contenido (value), que puede ser de diferente tipo
que el resto de los elementos.

Suponemos que el alumno o alumna que hace este curso ya está familiarizado
con las matrices, por lo cual damos por explicados los principales conceptos
sobre los arrays. Aquí nos vamos a limitar a resumir brevemente las principales
funciones con las que PHP trata este tipo de datos.

Crear e inicializar una matriz

En PHP, como en la mayoría de los lenguajes informáticos, hay varias formas


de crear un matriz y de asignar valores a cada uno de sus elementos. En la
Unidad 1, al explicar este tipo de datos, ya pusimos varios ejemplos:

$persona["nombre"] = "Josefa";
$persona["apellido1"] = "Pérez";
$persona["apellido2"] = "Rubio";
$persona["edad"] = 60;

En las cuatro instrucciones anteriores hemos creado la matriz $persona, que


tiene cuatro elementos que se referencian por cuatro índices de tipo cadena.
Pero también podíamos haber creado e inicializado esta matriz así:

$persona[] = "Josefa";
$persona[] = "Pérez";
$persona[] = "Rubio";
$persona[] = 60;

- 171 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

En este segundo caso, PHP asigna los índice 0, 1, 2 y 3 a cada elemento


secuencialmente. Lo mismo hubiéramos conseguido con la sintaxis

$persona[0] = "Josefa";
$persona[1] = "Pérez";
$persona[2] = "Rubio";
$persona[3] = 60;

aunque habría resultado más largo e innecesario. No es preciso asignar índices


que sean valores numéricos enteros consecutivos, si bien es preciso conocer el
número o el nombre de los índices para poder, después, referirse a los
elementos correspondientes.

Otra forma de crear la misma matriz con índices de cadena es la siguiente:

$persona = array("nombre"=> "Josefa","apellido1"=> "Pérez",


"apellido2"=> "Rubio","edad"=>60);

Como puede verse, esta sintaxis utiliza la palabra reservada array, pone entre
comillas los índices de cadena y usa el signo => para asignar el valor a los
elementos.

Para crear una matriz bidimensional con las calificaciones obtenidas por una
alumna en las tres evaluaciones de Matemáticas, Lengua y Dibujo usando
índices alfanuméricos, podemos escribir lo siguiente:

$notas["Mat"]["Pri"] = "Suficiente";
$notas["Mat"]["Seg"] = "Bien";
$notas["Mat"]["Ter"] = "Notable";
$notas["Len"]["Pri"] = "Sobresaliente";
$notas["Len"]["Seg"] = "Sobresaliente2;
$notas["Len"]["Ter"] = "Notable";
$notas["Dib"]["Pri"] = "Notable";
$notas["Dib"]["Seg"] = "Bien";
$notas["Dib"]["Ter"] = "Suficiente";

Con la misma filosofía de índices, podíamos haberlo hecho de la forma


siguiente:

$notas = array("Mat"=>array("Pri"=>"Suficiente",
"Seg"=>"Bien",
"Ter"=>"Notable"),
"Len"=>array("Pri"=>"Sobresaliente",
"Seg"=>"Sobresaliente",
"Ter"=>"Notable"),
"Dib"=>array("Pri"=>"Notable",
"Seg"=>"Bien",
"Ter"=>"Suficiente"));

Igualmente, podíamos haber puesto las calificaciones en número y usado


índices numéricos para las evaluaciones y las asignaturas, de 0 a 2 para
ambas. En este caso la matriz $notas habría quedado así:

- 172 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$notas[0][0] = 1;
$notas[0][1] = 2;
$notas[0][2] = 3;
$notas[1][0] = 4;
$notas[1][1] = 5;
$notas[1][2] = 6;
$notas[2][0] = 7;
$notas[2][1] = 8;
$notas[2][2] = 9;

Es más breve, si bien hay que saber a qué asignatura y evaluación pertenece
cada índice. En la sintaxis precedente quedaría así:

$notas = array(0=>array(0=>1,1=>2,2=>3),
1=>array(0=>4,1=>5,2=>6),
2=>array(0=>7,1=>8,2=>9));

Como hemos visto, pues, la función array() permite crear e inicializar matrices,
si bien no es la única forma de hacerlo.

Su sintaxis es

array(lista de elementos separados por comas);

En la lista de elementos se pueden poner valores de los diferentes tipos de


datos que admite PHP. Además, es posible especificar expresamente un índice
numérico o de cadena para referirse a cada uno de sus elementos.

La función range() devuelve una matriz que sólo contiene los elementos
indicados entre dos números, ambos incluidos.

Su sintaxis es

range(número entero del límite inferior, número entero del límite


superior);

Por ejemplo, si creamos la matriz $numeros=range(2,6) la matriz resultante


tiene cinco elementos: el primero contiene el valor 2 y el último, el valor 6.

Recorrer los elementos de una matriz unidimensional

Las matrices tienen un puntero que apunta a uno de sus elementos. Cuando se
accede o usa por primera vez una matriz, el puntero está posicionado sobre el
primer elemento. Pero no siempre está sobre este elemento, ya que el puntero
puede haberse movido para leer o modificar el contenido de la matriz.

La operación de recorrer los elementos de una matriz se lleva a cabo de forma


diferente según se trate de matrices secuenciales, es decir, que tienen
ordenados sus elementos por un índice ordinal como 0, 1, 2, 3, etcétera, o de
matrices no secuenciales, es decir, que no tienen ordenados sus elementos por
un índice ordinal.

- 173 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Si creamos una matriz sin utilizar expresamente un índice, PHP le asigna un


índice ordinal numérico secuencial, que se inicia con el valor 0. Así pues, los
elementos quedarán ordenados por su índice desde 0 hasta su elemento n-1.

Pero podemos crear una matriz asignándole un índice numérico que no esté
ordenado o incluso un índice de tipo cadena desordenado. Por ejemplo,
podíamos haber creado e inicializado así la matriz $persona:

$persona[10] = "Josefa";
$persona[2] = "Pérez";
$persona[5] = "Rubio";
$persona[1] = 60;

En este caso el primer elemento contendría también "Josefa", pero si queremos


acceder al mismo por su índice deberíamos citar el 10. Así pues, esta matriz
está desordenada por su índice. Veremos más adelante cómo ordenar matrices
por su índice o por el contenido de sus elementos.

La función reset() coloca el puntero de una matriz sobre su primer elemento


y devuelve su contenido. Por ejemplo, la instrucción echo reset($persona);
devuelve "Josefa".

Cuando conocemos que el índice utilizado en una matriz es de tipo numérico


entero secuencial (0, 1, 2,...), la forma más fácil de acceder a cada elemento es
usar la función count() para saber cuántos elementos tiene. Después,
podemos utilizar un bucle for para recorrer todos sus elementos.

La función end() coloca el puntero de una matriz sobre su último elemento y


devuelve su contenido. Por ejemplo, la instrucción echo end($persona);
devuelve 60.

La función count() (podemos invocar también esta función con sizeof(), ya


que se trata de un alias, algo así como un sinónimo) cuenta los elementos que
integran una matriz y devuelve un número entero. Por ejemplo, la instrucción
echo count($persona); devuelve 4. La instrucción echo sizeof($persona);
también devuelve 4.

A partir de esta información, podemos recorrer los elementos y mostrar su


contenido con un bucle, de esta forma:

$numero_elementos=count($persona);
for ($i=0; $i < $numero_elementos; $i++)
echo $persona[$i]."<P>";

Podemos pensar que nos hubiéramos evitado una instrucción si ponemos la


función count() como parte de la condición dentro de for. No es conveniente
hacerlo por dos motivos:

1. Evitar que se ejecute la función cada vez que se pase por el bucle con la
consiguiente pérdida de tiempo al contar siempre lo mismo.

- 174 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

2. Evitar un mal funcionamiento del bucle si dentro de las instrucciones del


bucle se altera el número de elementos de la matriz con la función unset().

En cambio, si queremos recorrer una matriz bidimensional, no podemos usar la


función count(), sino que debemos utilizar dos bucles, uno anidado en el otro
de esta forma:

for ($i=0; $i < 3; $i++)


{
for ($j=0; $j < 3; $j++)
echo "<B>".$notas[$i][$j]." - </B>";
}

La función next() devuelve el contenido del siguiente elemento según la


posición donde esté el puntero y desplaza éste a esa posición nueva. Si se ha
alcanzado el último elemento, esta función devuelve False.

Por ejemplo, la instrucción echo next($persona); devuelve "Pérez" si el


puntero estaba sobre el elemento primero antes de ejecutarse la función.

La función prev() devuelve el contenido del elemento anterior según la


posición donde esté el puntero y desplaza éste a esa posición nueva. Si se ha
alcanzado el primer elemento, esta función devuelve False.

Por ejemplo, la instrucción echo prev($persona); devuelve "Pérez" si el


puntero estaba sobre el elemento primero antes de ejecutarse la función.

La función current() devuelve el contenido de elemento sobre el que está el


puntero sin variar su posición. Por ejemplo, echo current($persona); devuelve
"Rubio" si el puntero está sobre el elemento 3. Si se ha sobrepasado el último
elemento de la matriz, current() devuelve False.

A partir de esta información también podemos recorrer los elementos y mostrar


su contenido con el bucle anterior

for ($i=0; $i < count($persona); $i++)


{
echo current($persona)."<P>";
next($persona);
}

La función key() devuelve el índice de la posición actual del puntero, se trate


de un número entero o de una cadena. Por ejemplo, la instrucción echo
key($persona); devuelve "apellido1" si el puntero está sobre el segundo
elemento.

Podemos recorrer los elementos y mostrar su índice y su contenido con las


instrucciones siguientes:

$datos=array("nombre"=>"Josefa","apellido1"=>"Pérez",
"apellido2"=>"Rubio","edad"=>60);

- 175 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$numero_elementos=count($persona);
for ($i=0; $i < $numero_elementos; $i++)
{
$indice=key($datos);
echo "Indice:<B> $indice. </B>Contenido: <B>$persona[$i]</B><P>";
next($datos);
}

Este código muestra la página siguiente:

Indice: nombre. Contenido: Josefa

Indice: apellido1. Contenido: Pérez

Indice: apellido2. Contenido: Rubio

Indice: edad. Contenido: 60

Convertir cadenas de caracteres en matrices y viceversa

La función explode() permite convertir una cadena de caracteres en una matriz


mediante un separador dado.

Su sintaxis es

explode(carácter separador, cadena);

La función implode() lleva a cabo la operación inversa: lleva los elementos de


una matriz a una cadena separándolos como se indique.

Su sintaxis es

implode(carácter separador, matriz);

Ordenar matrices

Ya hemos comentado que los elementos de las matrices pueden estar


desordenados, bien por su índice bien por su contenido. Veamos cómo
podemos ordenar los elementos de una matriz de diferentes formas.

La función arsort() ordena los elementos de una matriz teniendo en cuenta su


contenido de mayor (en el código ASCII) a menor manteniendo la asociación
del contenido de cada elemento con su índice.

Su sintaxis es

arsort(matriz);

Por ejemplo, si tenemos la matriz

- 176 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$palabras=array("1"=>"amazona","2"=>"león","3"=>"zozobra",
"4"=>"sabueso", "5"=>"bondad","6"=>"obús");

la instrucción arsort($palabras); devuelve la matriz

$palabras=array("3"=>"zozobra","4"=>"sabueso","6"=>"obús",
"2"=> "león", "5"=>"bondad","1"=>"amazona");

La función asort() hace exactamente lo mismo que la función


arsort()manteniendo la asociación del contenido de cada elemento con su
índice.

Su sintaxis es

asort(matriz);

Por ejemplo, si tenemos la matriz

$palabras=array("1"=>"amazona","2"=>"león","3"=>"zozobra",
"4"=>"sabueso", "5"=>"bondad","6"=>"obús");

la instrucción asort($palabras); devuelve la matriz

$palabras=array("1"=>"amazona","5"=>"bondad", "2"=> "león",


"6"=>"obús", "4"=>"sabueso","3"=>"zozobra");

La función rsort() ordena los elementos de una matriz teniendo en cuenta su


contenido de menor (en el código ASCII) a mayor pero sin mantener la
asociación del contenido de cada elemento con su índice.

La función sort() hace exactamente lo mismo que la función rsort().

La función krsort() ordena los elementos de una matriz teniendo en cuenta su


índice de mayor (en el código ASCII) a menor manteniendo la asociación de
cada índice con el contenido de cada elemento.

Su sintaxis es

krsort(matriz);

Por ejemplo, si tenemos la matriz

$palabras=array("1"=>"amazona","2"=>"león","3"=>"zozobra",
"4"=>"sabueso","5"=>"bondad","6"=>"obús");

la instrucción krsort($palabras); devuelve la matriz

$palabras=array("6"=>"obús","5"=>"bondad","4"=>"sabueso",
"3"=>"zozobra","2"=>"león","1"=>"amazona");

- 177 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La función ksort() ordena los elementos de una matriz teniendo en cuenta su


índice de menor (en el código ASCII) a mayor manteniendo la asociación de
cada índice con el contenido de cada elemento.

Su sintaxis es

ksort(matriz);

Por ejemplo, si tenemos la matriz

$palabras=array("1"=>"amazona","2"=>"león","3"=>"zozobra",
"4"=>"sabueso","5"=>"bondad","6"=>"obús");

la instrucción ksort($palabras); devuelve la misma matriz, pues ya está


ordenada según su índice, ya que, al crearla, hemos colocado los índices
ordenados.

La función shuffle() devuelve una matriz en la que los elementos se han


ordenado de forma aleatoria.

Su sintaxis es

shuffle(matriz);

La función uasort() ordena los elementos de una matriz teniendo en cuenta su


contenido y según una función de comparación definida por el usuario
manteniendo la asociación del contenido de cada elemento con su índice.

Su sintaxis es

uasort(matriz,función de usuario);

Por ejemplo, si definimos la función de usuario compara() y la usamos como


segundo argumento de la función uasort(), obtenemos estos resultados:

function compara($a,$b)
{
return (substr($a,3,1)>substr($b,3,1))
}

$colores=array("a"=>"blanco","b"=>"azul","c"=>"rojo",
"d"=>"amarillo","e"=>"verde");
uasort($colores,"compara");
for (reset($colores);$indice=key($colores);next($colores))
echo "Indice: <B>$indice</B> Contenido:<B>$colores[$indice]
</B><P>";

En este caso la función uasort() ordena los elementos según el cuarto


carácter de su contenido de menor a mayor (se cuenta desde 0; por eso hemos
puesto 3 en la función de usuario), que es lo que ejecuta la función de usuario
compara(). Así pues, la matriz queda así:

- 178 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$colores=array("e"=>"verde","b"=>"azul","a"=>"blanco",
"c"=>"rojo","d"=>"amarillo");

La función usort() hace exactamente lo mismo que la anterior, suponiendo


lógicamente que aplicáramos la misma función de usuario que es la que
determina el orden de los elementos según su contenido, pero sin mantener la
asociación del índice de cada elemento con su contenido.

La función uksort() ordena los elementos de una matriz teniendo en cuenta su


índice y según una función de comparación definida por el usuario
manteniendo la asociación del índice de cada elemento con su contenido.

Su sintaxis es

uksort(matriz,función de usuario);

Por ejemplo, si definimos la función de usuario compara() y la usamos como


segundo argumento de la función uksort(), obtenemos estos resultados:

function compara($a,$b)
{
return (substr($a,3,1)>substr($b,3,1));
}

$colores=array("primero"=>"blanco","segundo"=>"azul",
"tercero"=>"rojo","cuarto"=>"amarillo",
"quinto"=>"verde");
uasort($colores,"compara");
for (reset($colores);$indice=key($colores);next($colores))
echo "Indice: <B>$indice</B> Contenido:<B>$colores[$indice]
</B><P>";

En este caso la función uksort() ordena los elementos según el cuarto


carácter de su índice de mayor a menor (se cuenta desde 0; por eso hemos
puesto 3 en la función de usuario), que es lo que ejecuta la función de usuario
compara().

Así pues la matriz queda así:

$colores=array("segundo"=>"azul","cuarto"=>"amarillo",
"quinto"=>"verde","primero"=>"blanco",
"tercero"=>"rojo");

Modificar matrices

Las matrices ya creadas e inicializadas pueden modificarse de diferentes


formas:

1. Uniendo los elementos de dos o más matrices.

La función array_merge(), recibe como argumentos dos o más matrices y


devuelve otra en la que se han unido todas las que se pongan como

- 179 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

argumentos anexionando los elementos de unas a continuación de las otras,


según el orden en que se pongan los argumentos.

Su sintaxis es

array_merge(matriz1,matriz2...);

Si en la mezcla algún índice se repite, el último en añadirse elimina el elemento


de las matrices anteriores en que se repita.

2. Completando los elementos de una matriz.

La función array_pad() rellena una matriz añadiendo los elementos que se


indique con el contenido que se especifique.

Su sintaxis es

array_pad(matriz,número de elementos de la matriz resultante,relleno


de los elementos añadidos);

donde matriz es la matriz original a la que se añaden elementos; número de


elementos es un entero que indica cuántos elementos tendrá la matriz después
de ejecutarse la función; relleno es la cadena o valor con el que se completará
el contenido de los nuevos elementos.

Si número de elementos es igual o inferior al número de elementos de la matriz


original, no se produce ningún cambio en la misma. Si es negativo, los
elementos se añaden por el principio de la matriz original. Si es positivo, se
añaden por el final.

Por ejemplo, si tenemos la matriz de cinco elementos

$sabores=array("dulce","amargo","salado","soso","menta");

la instrucción

$completa=array_pad($sabores,8,"indeterminado");

genera la matriz

$completa=array("dulce","amargo","salado","soso","menta",
"indeterminado","indeterminado", "indeterminado");

3. Invirtiendo el orden de la matriz original.

La función array_reverse() devuelve otra matriz que contiene los mismos


elementos ordenados al revés, es decir, invierte el orden de los elementos de

- 180 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

forma que el primero pasa a ser el último y el último pasa a ser el primero.
Hace, pues, lo mismo que la función rsort().

Su sintaxis es

array_reverse(matriz);

4. Sustituyendo un fragmento de elementos por otro.

La función array_splice() devuelve la misma matriz sustituyendo varios


elementos consecutivos por otros nuevos.

Su sintaxis es

array_splice(matriz original,posición inicial del desplazamiento,


longitud del desplazamiento,cadena-valor-matriz que
sustituye el fragmento de la original);

donde:

 el argumento posición inicial del desplazamiento es un número entero


que indica la posición, contando desde 0, del primer elemento que debe
ser sustituido. Si es menor que 0, se cuenta desde el último elemento de
la matriz original siendo el último elemento el que ocupa la posición –1.
 el argumento longitud del desplazamiento es un número entero que
indica el número de elementos que serán sustituidos a partir de la
posición especificada en el argumento anterior. Si se omite, se eliminan
todos desde la posición indicada. Si es menor que 0, se eliminan tantos
como se indique, pero contando desde el final de la matriz original hasta
la posición especificada.
 el argumento cadena, valor o matriz contiene el contenido que ha de
asignarse a los elementos eliminados. Puede no existir. En este caso, la
matriz original pierde los elementos eliminados sin ser sustituidos por
otros.

Veamos algunos ejemplos:

$matriz1=array("muy alto","alto","medio",
"bajo","muy bajo");
$matriz2=array("óptimo","bueno","malo");
array_splice($matriz1,2,2);

genera la matriz

$matriz1=array("muy alto","alto","muy bajo");

Se han eliminado los elementos tercero y cuarto.

array_splice($matriz1,2);

genera la matriz

- 181 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$matriz1=array("muy alto","alto");

Se han eliminado todos los elementos desde el tercero.

array_splice($matriz1,-2);

genera la matriz

$matriz1=array(("muy alto","alto","medio");

Se han eliminado los dos últimos elementos.

array_splice($matriz1,2,1);

genera la matriz

$matriz1=array(("muy alto","alto","bajo","muy bajo");

Se ha eliminado el elemento tercero.

array_splice($matriz1,3,3,$matriz2);

genera la matriz

$matriz1=array("muy alto","alto","medio", "óptimo","bueno","malo");

Se han sustituido, desde el elemento tercero, tres elementos con el contenido


de la matriz $matriz2.

array_splice($matriz1,count($matriz1),3,$matriz2);

genera la matriz

$matriz1=array("muy alto","alto","medio","bajo",

"muy bajo","óptimo","bueno","malo");

Se han añadidos los elementos de la segunda matriz a los de la primera.

No conviene confundirse con esta función: si generamos una segunda matriz


con esta misma orden, ésta contendrá los elementos eliminados.

Por ejemplo, la orden

$nueva=array_splice($matriz1,3,3,$matriz2);

genera la matriz

$nueva=("bajo","muy bajo");

que son los dos elementos eliminados de la matriz original.

- 182 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

5. Ejecutando una función de usuario sobre cada elemento de la matriz

La función array_walk() aplica una función de usuario a cada elemento de la


matriz.

Su sintaxis es

array_walk(matriz original,función de usuario,prefijo);

6. Juntando variables en una sola matriz

La función compact() devuelve otra matriz en la que se han incorporado como


elementos las diferentes variables y matrices que se especifiquen como
argumento. Como índice se pone el nombre de la variable y como contenido el
valor de cada variable.

Su sintaxis es

compact(lista de variables o arrays...);

Extraer información de las matrices

La función array_count_values() recibe como argumento una matriz y


devuelve otra cuyos índices son los contenidos de la original y cuyo contenido
es la frecuencia con que se repite el mismo contenido en la matriz original.

Su sintaxis es

array_count_values(matriz);

La función array_keys()recibe como argumento una matriz y devuelve otra que


contiene sólo los índices de la matriz original como contenidos de los nuevos
elementos. Como índices de la nueva matriz se asignan valores numéricos
enteros desde 0 en adelante.

Su sintaxis es

array_keys(matriz,valor);

El segundo argumento es opcional y, si se usa, sirve para decir que pase a la


matriz resultante sólo los índices de los elementos que contengan ese valor.

La función array_slice() devuelve otra matriz que contiene una porción de


elementos de la matriz original.

Su sintaxis es

array_slice(matriz original, posición inicial del desplazamiento,


longitud del desplazamiento);

- 183 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

donde

 el argumento posición inicial del desplazamiento es un número entero


que indica la posición, contando desde 0, del primer elemento que debe
ser extraído. Si es menor que 0, se cuenta desde el último elemento de
la matriz original siendo el último elemento el que ocupa la posición –1.
 el argumento longitud del desplazamiento es un número entero que
indica el número de elementos que serán extraídos a partir de la
posición especificada en el argumento anterior. Si se omite, se extraen
todos los elementos desde la posición indicada. Si es menor que 0, se
extraen tantos como se indique, pero contando desde el final de la
matriz original hasta la posición especificada.

Como se ve, esta función tiene un comportamiento similar a la función


array_splice(), pero aquí se extraen los elementos y en aquélla se eliminan o
sustituyen.

$altura=array("muy alto","alto","medio","bajo","muy bajo");


$nueva=array_splice($altura,2,2);

genera la matriz

$nueva=array("medio","bajo");

Se han extraído los elementos tercero y cuarto.

La función array_values()recibe como argumento una matriz y devuelve otra


en la que se han eliminado los índices dejando sólo los contenidos.

Su sintaxis es

array_values(matriz original);

Lógicamente, como no puede haber una matriz sin índices, a cada elemento se
le asignan índices numéricos desde 0 en adelante y se eliminan los que tuviera
antes, sean cadenas u otros valores numéricos.

La función each()lee el elemento actual de una matriz y avanza el puntero al


elemento siguiente. Con el elemento leído fabrica otra matriz de cuatro
elementos: dos para el índice (0 y key) y dos para el contenido (1 y value).
Generalmente, esta función se utiliza combinada con la función list() para
recorrer los elementos de una matriz con un bucle.

Su sintaxis es

each(matriz original);

Por ejemplo, si tenemos la matriz

- 184 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$con_indices=array("uno"=>"muy alto","dos"=>"alto",
"tres"=>"medio","cuatro"=>"bajo",
"cinco"=>"muy bajo");

y suponemos que el puntero está sobre el elemento "tres"=>"medio", la


instrucción $nueva=each($con_indices); devuelve la matriz de cuatro
elementos siguiente

$nueva=array(0=>"tres","key"=>"tres", 1=>"medio","value"=>"medio")

Los dos primeros elementos de la matriz resultante hacen referencia al índice


del elemento actual de la matriz original. De esta forma podemos referirnos a
su contenido también de dos formas: $nueva[0] o $nueva("key").

Como puede verse, los dos últimos elementos de la matriz resultante hacen
referencia al contenido del elemento actual de la matriz original. De esta forma
podemos referirnos a su contenido de dos formas: como $nueva[1] o como
$nueva("value").

La función extract()pasa los contenidos de los elementos de una matriz como


contenidos de las variables que llevan como nombre el índice de cada
elemento de la misma matriz. Como consecuencia, a la tabla de símbolos de
variables se incorporan estas nuevas variables.

Su sintaxis es

extract(matriz, si hay conflictos tipo de extracción,si hay conflictos


cadena de sustitución);

Los dos últimos argumentos son opcionales y sólo se aplican, si existen,


cuando al ejecutar la extracción se han producido colisiones, es decir, si la
variable que se pretendía crear ya existía e incluso si era de diferente tipo.

En caso de colisión entre variables, el segundo argumento tiene los valores


siguientes:

 EXTR_OVERWRITE: se descarta el valor anterior de la variable y se


pone el nuevo. Este valor es el que se usa por defecto en caso de
colisión, aunque no se indique como argumento.
 EXTR_SKIP: se descarta el valor nuevo de la variable y se pone el
anterior.
 EXTR_PREFIX_SAME: al nombre de la variable nueva conflictiva se le
pone como prefijo la cadena del tercer argumento seguida de un guión
de subrayado (_).
 EXTR_ PREFIX_ALL: al nombre de todas las variables nuevas
conflictivas se le pone como prefijo la cadena del tercer argumento
seguida de un guión de subrayado (_).

Esta función comprueba también si el nombre de las nuevas variables es válido


y sólo las crea si lo es.

- 185 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La función in_array()devuelve True si un valor está contenido en alguno de


los elementos de una matriz y False si no lo está,

Su sintaxis es

in_array(valor buscado, matriz donde se busca);

La construcción list()asigna en una única operación el valor de los elementos


de una matriz a una lista de variables que se usan como argumento. Ya
comentamos que la función each() se usa, por lo general, combinada con la
función list() para recorrer los elementos de una matriz dentro de un bucle.

Su sintaxis es

list(lista de variables);

Por ejemplo, si tenemos la matriz

$comunidad=array("CA1"=>"Aragón","CA2"=>"Andalucía",
"CA3"=>"Galicia","CA4"=>"Murcia",
"CA5"=>"Valencia","CA6"=>"Canarias");

el bucle siguiente recorre y muestra el contenido de todos sus elementos:

while (list($indice,$valor)=each($comunidad))
{
print ("El elemento <B>$indice</B> contiene el valor <B>$valor
</B><P>");
}

En la condición con la que se establece el bucle combinando list() y each()


se consigue que list() tome en sus dos variables el índice y el contenido de
cada elemento, que luego se muestran. Además, una vez proporcionada por
each() la información de cada elemento a list(), hace avanzar el puntero un
elemento más, por lo que el bucle se acaba cuando ya no hay elementos que
ofrezcan la información necesaria.

Tratar un array como si fuera una pila

PHP permite tratar las matrices como si fueran pilas de tipo LIFO (Last In First
Out, Último en Entrar Primero en Salir) mediante cuatro funciones. El concepto
de pila ya es clásico en Informática y se refiere a la forma de almacenar
información en forma de montón o pila, Si tenemos muchos platos, podemos
almacenarlos apilándolos unos encima de otros. En este caso lo más usual
será que el último plato colocado en la pila sea el primero que se retira. Las
matrices también pueden considerarse como pilas de datos, que son sus
elementos.

Veamos las funciones que nos permiten realizar operaciones de tipo pila con
las matrices.

- 186 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La función array_pop() extrae el último elemento de la matriz eliminándolo.

Su sintaxis es

array_pop(matriz);

La función array_push() añade elementos al final de la matriz.

Su sintaxis es

array_push(matriz,lista de elementos que se añaden);

La función array_shift() extrae el primer elemento de la matriz eliminándolo y


desplazando todos una posición a la izquierda.

Su sintaxis es

array_shift(matriz);

La función array_unshift() inserta elementos por el principio de la matriz


desplazando los demás a la derecha.

Su sintaxis es

array_unshift(matriz,lista de elementos que se añaden);

Es conveniente observar que, cuando añadimos elementos, PHP crea los


índices para cada uno, que son de tipo numérico ordinal.

Más funciones de matrices

La función array_combine() crea una matriz usando una matriz para las claves
y otra para sus valores.

La función array_walk_recursive() aplica una función de usuario


recursivamente a cada miembro de una matriz.

La función array_uintersect() lleva a cabo la intersección entre 2 o más


matrices y utiliza para comparar los elementos de cada matriz la función
indicada en el último parámetro.

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 3 (Tratamiento de


matrices) de la Unidad 3. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

En este programa se incluye la mayoría de los ejemplos cuyo código hemos ido
escribiendo junto a las funciones explicadas y otros nuevos que no aparecen
en el texto anterior. Te invitamos a que lo estudies en profundidad.

- 187 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Funciones creadas por el usuario

En los tres apartados anteriores hemos estudiado las principales funciones


estándar de que dispone PHP para realizar operaciones con cadenas, fechas y
matrices.

El usuario también puede crear sus propias funciones, como ya se ha hecho en


las dos primeras unidades y en esta misma. Por ejemplo, en el apartado
anterior, en el que se abordan las funciones estándar de las matrices, hemos
creado y usado las funciones de usuario cambia(), ver() y compara().

En este apartado vamos a explicar brevemente cómo se crean y usan


funciones de usuario con la finalidad de ahorrar muchas líneas de instrucciones
ejecutando siempre el mismo código, sin necesidad de repetirlo en cada
ocasión en que deba llevarse a cabo una tarea específica dentro del mismo
script.

El uso de funciones de usuario para tareas repetitivas facilita mucho y ahorra


tiempo en el proceso de modificación y actualización del código fuente.

Creación de funciones de usuario

Las funciones de usuario son bloques de código que pueden ser utilizados en
cualquier momento dentro del código PHP.

En primer lugar y antes de hacer uso de ellas, es preciso declararlas y crear su


código. Se hace con la sentencia function seguida del nombre de la función y
de las líneas de instrucciones. Estas últimas deben ir entre las llaves {...}. Si la
función tiene que devolver un valor a la línea de código donde se invocó, como
última instrucción hay que poner la orden return seguida del valor que se
devuelve. Si no se devuelve un valor, sino que sólo se ejecutan instrucciones
dentro del código de la propia función, puede prescindirse de la sentencia
return.

Las funciones, en la mayoría de los casos, tienen parámetros o argumentos


entre paréntesis, a través de los cuales se pasan los datos con los que hay que
realizar operaciones.

Tratemos de reflejar todo lo dicho en un ejemplo. Supongamos que dentro del


código PHP es preciso hallar y mostrar varias veces el cuadrado y el doble de
un número. Si disponemos de una función que lleve a cabo estas dos
operaciones, no será preciso más que invocar esta función cuantas veces sea
necesario pasándole cada vez el número del que es preciso obtener el
cuadrado y el doble. La escribiremos así:

function ver_cuadrado_y_doble($num=2)
{
$cuadrado=($num*$num);
$doble=($num*2);

- 188 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

echo "El cuadrado de <B>$num</B> es <B>$cuadrado</B>


y el doble es <B>$doble</B>.<P>";
}

$num1=4;
ver_cuadrado_y_doble($num1);
$num2=5;
ver_cuadrado_y_doble($num2);
$num3=6;
ver_cuadrado_y_doble($num3);
$num4=7;
ver_cuadrado_y_doble($num4);
ver_cuadrado_y_doble();

En este ejemplo aparecen casi todos los componentes de una función de


usuario, que son:

1. Sentencia function seguida del nombre de la función creada por nosotros


(ver_cuadrado_y_doble) y, entre paréntesis, del argumento ($num) que se
recibe desde el código del script. Fíjate que hemos escrito ($num=2) en el
argumento de la función. Esto significa que si no se indica el argumento,
entonces el valor por defecto es "2".

2. Sentencias que contienen el código que ha de ejecutarse dentro de la


función. Hay que ponerlas entre llaves {...}, como hemos hecho. Además, antes
de invocar una función de usuario, es preciso crearla, como hemos hecho. En
este ejemplo, no aparece la sentencia return, ya que no es necesario devolver
ningún valor por realizarse la operación completa dentro del código de la
función.

3. Invocación de la función de usuario dentro del script del código PHP. En


este ejemplo hemos invocado la función hasta cuatro veces. Desde esta línea
pasamos el valor que recibe la función en su argumento. Los nombres de
ambos argumentos (el de la invocación ($num1) y el de la función ($num) no es
necesario que coincidan). En cambio, sí es imprescindible que el número de
parámetros pasados y recibidos sea el mismo. En este caso se pasa uno y se
recibe uno.

Si no hubiera argumentos, se pone sólo el paréntesis. En nuestro caso sería lo


siguiente: ver_cuadrado_y_doble(); y el argumento $num tomaría el valor por
defecto, que es "2".

Veamos otro ejemplo en el que hay varios argumentos y necesitamos la


sentencia return. Se trata de una función que recibe tres palabras y fabrica con
ellas una matriz. Con la sentencia return devuelve la matriz. Se muestran,
luego, sus elementos fuera de la función con otra función de usuario que
hemos denominado ver(). Éste es el código:

function ver($contenido, $indice)


{
echo "Indice: <B>$indice</B> Contenido:<B> $contenido</B><br>\n";
}

- 189 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

function hacer_matriz($pal1,$pal2,$pal3)
{
$todas="$pal1,$pal2,$pal3";
$matriz=explode(",",$todas);
reset($matriz);
return $matriz;
}

$texto1="perro";
$texto2="rinoceronte";
$texto3="jirafa";

array_walk(hacer_matriz($texto1,$texto2,$texto3),'ver');

Hay varias cosas que debemos tener en cuenta al crear y utilizar funciones de
usuario. Son éstas:

 Aquí hemos utilizado la sentencia return $matriz como última


instrucción de la función hacer_matriz(). En la invocación de esta
función

array_walk(hacer_matriz($texto1,$texto2,$texto3),'ver');.

hemos mandado tres datos ($texto1,$texto2,$texto3), que se han recibido


como parámetros de la función ($pal1,$pal2,$pal3). Con ellos se ha operado
dentro del código de la función, pero sólo se ha devuelto uno ($matriz), que es
la matriz creada en la función cuyos elementos se muestran ahora con la
función de usuario ver(). Con la sentencia return no se pueden devolver
varios argumentos, sólo un valor.

 Podemos observar, además, que se pueden anidar varias funciones


unas dentro de otras, como hemos hecho aquí: como primer argumento
de una función estándar hemos puesto una función de usuario y como
segundo argumento, otra función. Sólo hay que procurar que los
argumentos sean válidos tanto por su número como por el tipo de dato
que requieren.
 En este ejemplo, hemos pasado los datos con el procedimiento
denominado por valor, es decir, que en la función se crea una copia de
los datos que se reciben, de forma que, aunque se modifique su
contenido dentro de la función, en el código PHP siguen manteniéndolo.
Por ejemplo, la variable $texto1 al enviarla contiene el contenido “perro”.
Aunque dentro de la función se modifique $pal1, variable donde se
recibe, y se le asigne el contenido “león”, la primera seguirá
conservando su valor inicial.

En el siguiente ejemplo vamos a usar el mismo código, casi, para pasar datos
por referencia.

function cambiar(&$pal1,&$pal2,&$pal3)
{
$pal1=strtr($pal1,'aeiou','.....');
$pal2=strtr($pal2,'aeiou','.....');

- 190 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$pal3=strtr($pal3,'aeiou','.....');
$pal1=strrev($pal1);
$pal2=strrev($pal2);
$pal3=strrev($pal3);
}

$texto1="perro";
$texto2="rinoceronte";
$texto3="jirafa";
echo "<H3><CENTER>Inicialmente las variables \$texto1,
\$texto2 y \$texto3 contienen:</H3></CENTER>";
echo "<B>$texto1</B><P>";
echo "<B>$texto2</B><P>";
echo "<B>$texto3</B><P>";
echo "<H3><CENTER>Después de la transformación las variables
\$texto1,\$texto2 y \$texto3 contienen:</H3></CENTER>";
cambiar($texto1,$texto2,$texto3);
echo "<B>$texto1</B><P>";
echo "<B>$texto2</B><P>";
echo "<B>$texto3</B><P>";

En este código hemos pasado los datos por referencia, es decir, las variables
que se escriben como parámetros en la función también pueden ser
modificadas en el código PHP de la citada función. Para conseguir esto, hay
que utilizar el signo andpersand (&) delante de los parámetros de la función.
Cuando, después de haber ejecutado la función cambiar(), mostramos los
mismos datos en la página, podemos observar que sí han cambiado como
necesitamos.

En cuanto al ámbito o alcance de las variables, así como sobre la vida de


éstas, aplicado ahora a las funciones, vale lo que ya hemos explicado en el
apartado Ámbito de las variables de la Unidad 2.

Mediante Eclipse PDT puedes abrir el proyecto Ejemplo 4 (Funciones de


usuario) de la Unidad 3. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

En este Ejemplo se incluye el código que hemos ido escribiendo en las


funciones de usuario creadas en este apartado.

Además, hemos incluido un Ejemplo que muestra la utilización de funciones de


matrices aplicadas a un sencillo juego de cartas. Es importante que estudies su
código fuente ya que enseña cómo utilizar matrices conjuntamente con
funciones de usuario.

Usando Eclipse PDT puedes abrir el proyecto Ejemplo 6 (Baraja) de la


Unidad 3. Estudia el código fuente y ejecútalo para mostrar en el navegador
su resultado.

Si ejecutas en Eclipse PDT el proyecto verás que aparece la siguiente página


en el navegador:

- 191 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

- 192 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La Programación Orientada a Objetos (POO)

El lenguaje PHP ha ido incorporando también las técnicas y procedimientos


propios de la programación orientada a objetos, incluyendo la mayoría de las
características de este tipo de programación. En este último apartado de la
Unidad 3 vamos a explicar cómo se crean y usan objetos en PHP.

Qué son las clases

Sobre este asunto conviene recordar que hay una gran similitud entre lo que
llamamos en informática objetos y los objetos de la vida real. Las clases son un
conjunto o colección de variables que describen algo y de funciones que
acceden a esas variables para actuar sobre ellas. Aplicando este concepto a la
vida real, podemos decir que una clase informática es como un diseño, modelo
o proyecto de algo, que describe ese algo y determina las operaciones o
funcionalidades que pueden llevarse a cabo con eso.

Supongamos que a un ingeniero aeronáutico se le encarga el diseño de un


prototipo de avión. Ese profesional describe en los planos y memorias ese
prototipo indicando qué características va a tener: envergadura, tamaño,
capacidad, potencia, etcétera. Estos son las propiedades o variables del objeto.
Además, debe definir qué operaciones y funcionalidades va a tener: aterrizar,
despegar, navegar, etcétera. Estos son las funciones del objeto. Pues bien, en
un programa informático a ese conjunto o colección de datos y funciones,
relacionadas con los datos y reflejadas en el proyecto o modelo, lo llamamos
clase. Lo mismo ocurre si un arquitecto diseña un edificio, un ingeniero de
caminos una carretera o un entrenador deportivo una técnica de ataque o de
defensa. Conviene tener en cuenta que se trata sólo de un diseño, de un
modelo, de una plantilla, no convertida todavía en realidad, en objeto concreto.

Una vez creado un objeto informático, la persona que desarrolla un programa


puede incorporarlo con facilidad, al margen incluso de otros programadores
que estén desarrollando otra sección de la misma aplicación. La POO permite,
pues, una programación más estructurada a través de los objetos. El
desarrollador no tiene que conocer necesariamente cómo funciona ni cómo es
por dentro un objeto. Le basta conocer para qué sirve, cómo es y cómo puede
modificar esas características (variables), de qué forma (funciones) y qué
parámetros (argumentos) debe poner para que lo haga. Un objeto es como una
caja negra de la que hay que saber únicamente sacar información, en nuestro
caso hay que saber utilizarlo.

Para qué sirven las clases

Las clases son el máximo exponente de la POO y PHP implementa en su


lenguaje toda la funcionalidad necesaria para definirlas. Usándolas podemos
hacer el código más legible y, además, reutilizable. Escribir el código de una
clase es más largo que escribir el código directamente, pero a largo plazo
resulta más rentable, ya que podemos hacer uso de una misma clase en otras

- 193 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

aplicaciones. Además, el mantenimiento de la clase es único, por lo que nos


ahorra tener que buscar y modificar los fragmentos que usen las mismas líneas
de código en diferentes scripts.

Por lo demás, aunque en versiones anteriores PHP no era un lenguaje


orientado a objetos, en la última versión de PHP 5 sí dispone de todas las
características de un lenguaje orientado a objetos, como los interfaces y
métodos de polimorfismo. Si bien, PHP 5 no dispone todavía de un sistema de
herencia múltiple.

Creación de objetos en PHP

En la POO los conceptos de clase y objeto están íntimamente relacionados.


Una clase es un modelo, patrón o plantilla sobre el cual se plantea un objeto.
Un objeto es ya una instancia de una clase, es decir, un caso real que se crea
basándose en el modelo clase. En el ejemplo anterior la clase avión define el
modelo genérico de lo que debe ser un avión. Cuando se concreta ya en la
clase avión las características y funcionalidades que hemos atribuido a nuestro
avión, se convierte en un objeto.

Para declarar una clase hay que usar la palabra reservada class seguida del
nombre de la clase que se quiere crear. Todas las instrucciones que integran la
nueva clase deben ir entre los signos {…}. Además, para definir las
propiedades de la clase, las variables tienen que ir precedidas de las palabras
reservadas public, protected o private. Observa el ejemplo siguiente:

class carro_compra
{
public $productos = array();
function __construct($clase="zumo",$numero=5)
{
$this->incluir_productos($clase,$numero);
}
function __destruct()
{
unset($this->productos);
}
function incluir_productos($clase,$numero)
{
$this->productos[$clase]+=$numero;
}
function retirar_productos($clase,$numero)
{
if($this->productos[$clase] > $numero)
{
$this->productos[$clase]-=$numero;
return true;
} else
{
return false;
}
}
}

- 194 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

En este ejemplo definimos una clase llamada carro_compra. Está integrada por
una matriz ($productos), en cuyos elementos se guardan los productos, y dos
funciones para meter (incluir_productos) estos productos en el carro y
sacarlos (retirar_productos) del mismo. Observa que usamos también el
prefijo $this->, que es un puntero especial que nos permite citar cada
elemento de la matriz. Es una forma breve de sustituir el nombre de la clase.
En lugar de codificar la instrucción escribiendo carro_compra->productos
podemos escribir, de forma más breve, $this->productos.

Opcionalmente, las clases pueden incluir una función especial


denominada constructor. Esta función se ejecuta automáticamente cada vez
que se crea un objeto. Aunque podamos invocar la función constructor
cuando queramos como lo hacemos con cualquier otra función, generalmente,
se usa para llevar a cabo operaciones básicas, como determinar el tipo de
datos que va a contener la clase, asignar valores a sus variables, inicializar las
propiedades o los métodos del objeto, etcétera. Para que una función de las
creadas dentro de una clase se convierta en constructor, es preciso que llame
__construct. El constructor también puede tener parámetros a través de los
cuales recibe datos. En el ejemplo anterior el constructor es la función

function __construct($clase="zumo",$numero=5)
{
$this->incluir_productos($clase,$numero);
}

donde hacemos que, cada vez que se instancie la clase en un nuevo objeto,
nuestra compra del carro incluya 5 unidades del producto "zumo".

En versiones anteriores de PHP el constructor se llamaba igual que la clase.


Notamos que PHP 5 es también compatible con esta definición.

Sin embargo, a partir de PHP 5.3.3, los métodos con el mismo nombre que el
último elemento de una clase en un nombre de espacios no serán más tratados
como un constructor y serán una función más.

En este ejemplo anterior sería así:

function carro_compra($clase,$numero)
{
$this->incluir_productos($clase,$numero);
}

Además, también opcionalmente, las clases pueden incluir una función especial
denominada destructor. Esta función se ejecuta automáticamente cada vez
que se destruye un objeto. Generalmente, se usa para llevar a cabo las
operaciones para liberar los recursos y las variables del objeto. Para que una
función de las creadas dentro de una clase se convierta en destructor, es
preciso que llame __destruct. En el ejemplo anterior el destructor es la función

- 195 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

function __destruct()
{
unset($this->productos);
}

donde hacemos que, cada vez que se destruya un objeto, se borran


previamente todos los productos del carro de la compra.

Nota: El destructor será invocado incluso si el usuario detiene la ejecución del


script parando la carga de la página en su navegador.

Cómo se crean y se usan los objetos

Hemos dicho que las clases son como plantillas o diseños o proyectos,
colecciones de variables, propiedades y funciones que forman un conjunto.
Pero aún no existen como objetos reales. Para ello, hay que instanciar la clase,
es decir, concretarla en un objeto. Los objetos son, pues, instancias a una
clase, es decir, tipos de datos que asumen las variables, propiedades, atributos
y métodos de la clase a la que pertenecen. Cada objeto es único e
independiente de otro que pueda crearse como instancia de la misma clase.

En PHP se crea un objeto usando la palabra reservada new. Con esta sentencia
se asigna a una variable o clave las características de la clase que se instancia.
Por ejemplo, para crear un objeto de la carro_clase debemos escribir

$mi_compra = new carro_compra;

A partir de ahora ya podemos referirnos a este objeto, que contendrá el tipo de


datos declarado en la clase. Además, podemos actuar sobre sus propiedades
(variables) y métodos (funciones), llevando a cabo en el objeto las operaciones
que se hayan establecido en la clase.

También podemos incluir parámetros que pasarán al constructor directamente.


Cuando se pasan valores en los parámetros la función se ejecuta sin tener en
cuenta los valores asignados por defecto dentro de la función constructor.
Cuando se pasa solamente parte de los valores la función toma los valores
recibidos y conserva los demás asignados por defecto. Esto mismo pasa con
las demás funciones, aunque no sean el constructor.

Por ejemplo, podemos escribir $mi_compra = new carro_compra("zumo",5);

para hacer que el objeto se inicialice con esta información.

En la instrucción anterior no sólo se crea el objeto $mi_compra, sino que


además se llama al constructor de esta clase para pasar información al objeto
creado mediante la función incluir_productos($clase, $numero).

Cómo se usan las propiedades y método de un objeto

- 196 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

En PHP todas las propiedades y métodos de la clase pueden ser vistos desde
fuera de la misma, siempre y cuando sean son públicos (ver apartado más
abajo sobre Ámbito de variables y funciones). Esto significa que podemos
acceder a ellos desde fuera de la clase citando directamente la propiedad o el
método precedidos del nombre del objeto y del signo apuntador ->. Por
ejemplo, podemos escribir lo siguiente:

// Creamos el objeto.
$mi_compra = new carro_compra;

// Mostramos el número de productos de un objeto


// accediendo a su propiedad $productos.
// Observa que $productos es una matriz y que usamos
// como índice de la misma el nombre del producto.
echo $mi_compra->productos["café"];

// Incluimos un producto en el objeto citando la función


// que hemos creado como constructor.
$mi_compra->incluir_productos("café",4);

Observa que los métodos de un objeto son llamados de la misma forma que las
funciones normales pasándoles, cuando los haya, los parámetros que
necesiten. Los métodos son funciones que pertenecen al objeto, por lo que es
preciso indicar el nombre del objeto al que pertenecen. Así pues, la forma de
llamar a un método es igual que la de llamar a una propiedad de un objeto.

Si los métodos devuelven algún valor, podemos asignarlo a una variable. Por
ejemplo, en lugar de mostrar el número de productos del objeto $mi_compra,
podíamos haberlo asignado a la variable $producto_cafe de esta forma:

$producto_cafe = $mi_compra->productos["café"];

Las variables definidas e incluso inicializadas con algún valor dentro de la clase
pueden usarse directamente dentro de la propia clase por las funciones
internas de la misma, sin necesidad de usar el signo ->. En este caso, tendrán
un ámbito exclusivamente local, no serán públicas.

Ejemplos

Veamos un sencillo ejemplo de lo expuesto anteriormente. Estudia su código y


haz que PHP lo interprete dentro de un script, para que puedas comprobar
mejor sus resultados.

Ejemplo 1

<?

class suma
{
public $numero1=15;
public $numero2=23;

- 197 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

function opera()
{
echo $this->numero1+$this->numero2;
}

$resultado = new suma;


$resultado->opera();

?>

En este script se ha llevado a cabo una sencilla operación de sumar dos


números y mostrar su resultado en el navegador del usuario. Se ha hecho
usando una clase y un objeto, más por motivos didácticos que por conveniencia
de recursos de programación.

En la primera parte del código se crea la clase suma haciendo preceder su


nombre por la palabra reservada class. Los signos {…} delimitan el código de la
clase. Las variables $numero1 y $numero2 son propiedades o atributos de esta
clase. Observa que deben ir precedidas de la palabra reservada public. A la
vez que se declaran, se les ha asignado un valor numérico entero. La función
opera() constituye un método de esta clase. Esta función suma los valores de
las dos variables anteriores y muestra el resultado de dicha suma. Observa que
el puntero especial $this-> sustituye al nombre de la clase. El nombre de las
dos variables que lo siguen ahora no va precedido del símbolo $.

En la segunda parte del código, ya fuera de la creación de la clase, se instancia


en un objeto la clase creada. El objeto creado se llama $resultado. La palabra
reservada new, seguida del nombre de la clase, permite crear este objeto, que
tendrá las mismas propiedades y métodos que la clase. Finalmente, se llama al
método opera() desde el propio objeto. También ahora es preciso apuntar con
el signo -> al nombre de la función.

Ejemplo 2

Veamos otro ejemplo parecido, pero algo más complejo, en el que se crean dos
objetos a partir de la misma clase y se amplía el número de métodos.

<?

class resta
{
public $diferencia;

function calcula($x,$y)
{
$this->diferencia=$x-$y;
}

function muestra()
{

- 198 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

echo $this->diferencia,"<br>";
}

$dife = new resta;


$dife->calcula(10,5);

$dife1 = new resta;


$dife1->calcula(23,11);

$dife->muestra();
$dife1->muestra();

?>

En la primera parte de este código se crea una clase denominada resta.


Dentro de ella se define la variable (propiedad) $diferencia y dos funciones
(métodos): la función calcula() para hallar la diferencia entre dos números
($dife y $dife1) que se reciben como parámetros cuando se invoca desde los
objetos. Esta función devuelve el resultado de restar el segundo número del
primero. La función muestra() envía al navegador del usuario el valor de la
propiedad $diferencia.

En la segunda parte del código, fuera ya del código donde se crea la clase, se
crean dos objetos de la clase anterior: $dife y $dife1. Además, se usan los
métodos de la misma, enviando en el primero de éstos los operandos con los
que deben realizarse las operaciones de la resta.

Ejemplo 3

En este tercer ejemplo, muy parecido al anterior, vamos a ver cómo la


información de las propiedades de una clase, instanciada en un objeto, pueden
guardarse en una matriz.

<?

class producto
{
public $resul=array();
public $i=0;

function opera($v,$s)
{
$this->resul[$this->i]=$v*$s;
$this->i++;
}

function muestra()
{
foreach($this->resul as $numero)
{
echo $numero,"<br>";
}

- 199 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

}
}

$produc = new producto;


$produc->opera(5,4);
$produc->opera(10,6);
$produc->opera(-5,16);
$produc->muestra();

?>

En este script creamos la clase producto y el objeto produc. Lo nuevo aquí es


que la variable $resul es un dato de tipo array en cuyos elementos se va
guardando el resultado de multiplicar los dos números que se envían como
parámetros cada una de las tres veces que se interpreta el método opera(),
llamado desde el objeto produc. En la función muestra() se usa un bucle con la
sentencia foreach para mostrar el valor de cada uno de los tres elementos
introducidos.

Ten en cuenta que, si llamamos varias veces a una función del mismo objeto,
los resultados de la última llamada se sobrescriben sobre los de la llamada
anterior. Si queremos, pues, conservar la información anterior, será preciso
crear varios objetos o bien usar una matriz, como hemos hecho en el ejemplo
último.

Ejemplo 4

En este cuarto ejemplo usamos un constructor para completar de forma


automática los datos del primer elemento de la matriz que se muestra en la
tabla. Ten en cuenta que siempre que se crea un objeto la función constructor
se ejecuta automáticamente. En el código siguiente se calculan las operaciones
de suma, resta, multiplicación y división con los valores:

<?

class varios
{
public $valor_inicial=20;
public $numero_1=array();
public $numero_2=array();
public $suma=array();
public $resta=array();
public $producto=array();
public $division=array();
public $control=0;

function varios ($valor_1=60,$valor_2=15)


{
$this->control+=1;
$a=$this->control;
$this->numero_1[$this->control]=$valor_1;
$this->numero_2[$a]=$valor_2;
$this->suma[$a]=$valor_1+$valor_2;
$this->resta[$a]=$valor_1-$valor_2;

- 200 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$this->producto[$a]=$valor_1*$valor_2;
$this->division[$a]=$this->valor_inicial*$valor_1/$valor_2;

function muestra()
{
echo "<table align=center border=1>";
echo "<td>Número 1</td><td>Número 2</td><td>Suma</td>";
echo "<td>Resta</td><td>Multiplicación</td>
<td>División</td><tr>";

foreach($this->numero_1 as $indice=>$valor)
{
$n2=$this->numero_2[$indice];
$s=$this->suma[$indice];
$r=$this->resta[$indice];
$p=$this->producto[$indice];
$d=$this->division[$indice];
echo "<td align=center>$valor</td>";
echo "<td align=center>$n2</td>";
echo "<td align=center>$s</td>";
echo "<td align=center>$r</td>";
echo "<td align=center>$p</td>";
echo "<td align=center>$d</td><tr>";
}
echo "</table>";
}
}

$calculos= new varios;


for ($i=1;$i<11;$i++)
{
for ($j=1;$j<11;$j++)
{
$calculos->varios($i,$j);
}
}

$calculos->muestra($i,$j);

?>

Observa que en este ejemplo se pasan unos valores directamente al


constructor desde dentro de la propia clase, es decir, datos definidos e
inicializados en la misma clase. Hay otra forma de pasar valores, que consiste
en pasar valores como parámetros creados e inicializados fuera de la clase,
como hemos visto antes en algún ejemplo.

Otros ejemplos

Un ejemplo clásico es el que se aplica a un vehículo, como un coche, al que se


asignan ciertas propiedades (variables) y atribuyen determinados métodos
(funciones).

<?

- 201 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

class vehiculo
{

// Propiedades.
public $velocidad, $color, $gama;
// Constructor: asignación de velocidad inicial,
// color y gama.

function __construct()
{
$this->velocidad = 0;
$this->color = "blanco";
$this->gama = "alta";
}

// Método acelerar. El coche va más rápido.


function acelerar($velo)
{
$this->velocidad=$velo;
}

// Método frenar. El coche va más lento


// hasta frenar.
function frenar($velo)
{
if ($this->velocidad > 0)
{
$this->velocidad=$velo;
}
}

$mi_coche = new vehiculo;


echo "Mi coche es de color ".$mi_coche->color."<br><br>";
echo "Su gama es ".$mi_coche->gama.".<br><br>";
echo "Ahora está parado: ".$mi_coche->velocidad."kilómetros.<br><br>";
$mi_coche->acelerar(100);
echo "Mi choche ha acelerado. Ahora avanza a ".$mi_coche->velocidad
." kilómetros por hora.<br><br>";
$mi_coche->frenar(10);
echo "Mi choche ha frenado. Ahora avanza a ".$mi_coche->velocidad
." kilómetros por hora.<br><br>";

?>

La herencia

PHP puede crear clases extendidas, es decir, clases que pueden heredar las
propiedades (variables) y métodos (funciones) de la clase original, a la vez que
pueden tener otras propiedades y métodos propios. Esta posibilidad recibe en
la POO el nombre de herencia. Así pues, se pueden crear nuevas clases
basadas en otra anterior, cuyas propiedades y métodos son recogidos en la
nueva sin necesidad de repetir todo el código.

- 202 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La clase original se denomina parent o superclase y la clase nueva, child o


subclase.

La instrucción extends permite crear una clase a partir de su clase padre. Su


sintaxis es como sigue:

Class camion extends vehiculo


{
declaraciones (propiedades, métodos,funciones) de la clase;
}

A partir de ahora la clase camion tendrá las mismas propiedades y métodos que
vehiculo, además de los propios.

Ejemplo

<?

class vehiculo
{

// Propiedades.
public $velocidad, $color, $gama;
// Constructor: asignación de velocidad inicial,
// color y gama.

function __construct()
{
$this->velocidad = 0;
$this->color = "blanco";
$this->gama = "alta";
}

// Método acelerar. El vehículo va más rápido.


function acelerar($velo)
{
$this->velocidad=$velo;
}

// Método frenar. El vehículo va más lento


// hasta frenar.
function frenar($velo)
{
if ($this->velocidad > 0)
{
$this->velocidad=$velo;
}
}

class camion extends vehiculo


{

- 203 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

// Propiedades: añadimos una nueva propiedad.


public $peso_max;

function __construct()
{
// Es necesario invocar el constructor de la clase padre ya
// que PHP no lo hace automáticamente
parent::__construct()
$this->peso_max=1000;
}

function ver_datos()
{
echo "Los datos del camión son: <BR>".
"velocidad: <b>". $this->velocidad . "</b><BR>"
"color: <b>". $this->color . "</b><BR>"
"gama: <b>". $this->gama . "</b><BR>"
"peso máx: <b>". $this->peso_max . "</b><BR>";
}

$el_camion = new camion();


$el_camion->ver_datos();

?>

Como puedes ver, la clase camion recibe de la clase original vehiculo las
propiedades que tiene ($velocidad, $color y $gama). Por su parte incorpora al
diseño de la clase original otra propiedad (variable $peso_max) y una nueva
función, que es su constructor, llamado en esta caso ver_datos().

Hay que tener en cuenta que para las clases heredadas el


constructor/destructor de la clase padre no se ejecuta automáticamente cuando
se llama al constructor/destructor de la clase hija. Por tanto, en una clase hija
sólo se ejecuta de forma automática su propio constructor/destructor si lo hay.
El constructor/destructor de la clase original (padre) sólo se ejecuta en la clase
hija si es invocado expresamente desde ésta, tal y como hemos hecho en el
ejemplo anterior.

¿Soporta PHP la herencia múltiple?

Algunos lenguajes POO permiten la herencia múltiple, esto significa que una
subclase puede heredar de varias clases padres. PHP no permite esto y una
subclase solo puede heredar de una clase padre, sin embargo en PHP no hay
ningún tipo de restricción en cuanto al número de subclases que pueden
heredar de una misma clase padre o superclase.

- 204 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Polimorfismo en PHP 5

Cualquier lenguaje de programación orientado a objetos debe soportar el


polimorfismo, esto significa que diferentes clases tendrán un comportamiento
distinto para la misma operación. Esto se ve más claro con el siguiente
ejemplo.

Supongamos que tenemos dos clases distintas coche y ciclomotor. Ambas


tienen sus propios métodos de movimiento, éstos tienen diferentes
comportamientos, pero su nombre es el mismo

class coche {
function avanza() {
}
function para() {
}
function girar_derecha() {
}
}

class ciclomotor {
function avanza() {
}
function para() {
}
function girar_derecha() {
}
}

Como podemos observar, ambas clases tienen los mismos métodos,


supongamos ahora que tenemos otra clase que controla el movimiento de
todos los vehículos, es aquí donde entra en juego el polimorfismo, que
dependiendo del objeto que tratemos actuará de una forma u otra el método al
que llamamos.

class movimiento {
function mover_adelante($obj) {
$obj->avanza();
}
}

Supongamos que queremos mover cualquier vehículo hacia adelante entonces


escribimos:

$obj_coche = new coche();


$obj_ciclomotor = new ciclomotor();

$obj_movimiento = new movimiento();

// con esta sentencia el coche avanzaria hacia adelante.


$obj_movimiento->mover_adelante($obj_coche);

- 205 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

// con esta sentencia el ciclomotor avanzaría hacia adelante.


$obj_movimiento->mover_adelante($obj_ciclomotor);

Como podemos ver el mismo método del objeto movimiento actúa de dos
formas diferentes dependiendo del objeto que le pasamos como parámetro.

Ámbito de variables y funciones

En la teoría de la Unidad 2 se explicó el ámbito de variables. El ámbito de una


variable o función de una clase es algo muy parecido.

Las directivas de visibilidad permiten restringir el acceso a las propiedades y


métodos de un objeto. Se puede definir anteponiendo, en la declaración de una
propiedad o un método de la clase, una de las palabras claves siguientes:

 public: significa que el acceso es público y se puede acceder a la


propiedad o método desde cualquier ámbito (parte) del código PHP.
 private: indica visibilidad privada y limitan el ámbito de acceso a la
propiedad o método desde la misma clase que la define. Es decir, no se
podrá usar desde la página principal del programa.
 protected: marca una propiedad o método como protegido y permite el
acceso desde la misma clase, desde las clases que hereden de ella
(hijas) y desde las clases parent (padres).

Cuando definimos una propiedad o un método sin indicar ninguna directiva de


visibilidad explícita, entonces PHP los marcará automáticamente con visibilidad
public.

En el caso de las variables siempre es obligatorio definirlas con public,


protected o private. En el caso de funciones puede omitirse esta palabra, en
cuyo caso PHP supondrá que está definida como public. Nota: el constructor
__construct siempre se considera una función pública.

Ejemplo de ámbito visibilidad de las propiedades:

<?

// Definimos la clase automovil


class automovil
{
public $variable_publica = 'Pública';
protected $variable_protegida = 'Protegida';
private $variable_privada = 'Privada';

function imprimir_variables()
{
echo $this->variable_publica;
echo $this->variable_protegida;
echo $this->variable_privada;
}
}

- 206 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$objeto = new automovil();


// Se muestra la variable pública
echo $objeto->variable_publica;
// PHP muestra un error porque no se puede mostrar una variable
protegida
echo $objeto->variable_protegida;
// PHP muestra un error porque no se puede mostrar una variable
privada
echo $objeto->variable_privada;
// PHP muestra las 3 variables
$objeto->imprimir_variables();

// Definimos la clase automovil_descapotable


// que es heredada de la clase automovil
class automovil_descapotable extends automovil
{
// Podemos redeclarar la variable protegida pero no la privada
protected $variable_protegida = 'Protegida 2';

function imprimir_variables()
{
echo $this->variable_publica;
echo $this->variable_protegida;
echo $this->variable_privada;
}
}

$objeto2 = new automovil_descapotable();


// Se muestra la variable pública
echo $objeto->variable_publica;
// PHP muestra un error porque no se puede mostrar una variable
protegida
echo $objeto->variable_protegida;
// PHP muestra un error porque la variable privada no se hereda
echo $objeto->variable_privada;
// PHP muestra sólo 2 variables, la privada no se hereda
$objeto->imprimir_variables();

?>

Ejemplo de ámbito visibilidad de las funciones:

<?

// Definimos la clase automovil


class automovil
{
// El constructor siempre es público
public function __construct() { }

// Declaramos una función público


public function funcion_publica() { echo "función pública"; }

// Declaramos una función protegida


protected function funcion_protegida() { echo "función protegida";
}

- 207 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

// Declaramos una función privada


private function funcion_privada() {echo "función privada"; }

// Esta función es pública porque no se ha escrito nada


function funcion_que_ejecuta_todas()
{
$this->funcion_publica();
$this->funcion_protegida();
$this->funcion_privada();
}
}

$objeto = new automovil;


// Muestra el resultado de la fucnión pública
$myclass->funcion_publica();
// PHP muestra un error porque no se puede ejecutar una función
protegida
$myclass->funcion_protegida();
// PHP muestra un error porque no se puede ejecutar una función
privada
$myclass->funcion_privada();
// PHP ejecuta las 3 funciones
$myclass->funcion_que_ejecuta_todas();

// Definimos la clase automovil_descapotable


class automovil_descapotable extends automovil
{
// Esta función es pública
function funcion_que_ejecuta_todas2()
{
$this->funcion_publica();
$this->funcion_protegida();
// PHP muestra un error porque las funciones privadas no se
heredan
$this->funcion_privada();
}
}

$objeto2 = new automovil_descapotable;


// Muestra el resultado de la fucnión pública
$myclass->funcion_publica();
// PHP sólo ejecuta las 2 funciones porque la privada no se hereda
$myclass->funcion_que_ejecuta_todas2();

?>

Funciones para obtener información de las clases y objetos

PHP tiene ya diseñadas algunas funciones útiles para trabajar con clases y
objetos. Son las siguientes:

 method_exists(objeto, función), que comprueba si objeto tiene definida


una función. Devuelve True (verdadero) si lo está y False (falso) si no lo
está.
 get_class_vars(clase), que devuelve una matriz asociativa que lleva
como índice de sus elementos el nombre de cada variable definida e

- 208 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

inicializada dentro de la clase y como contenido el valor asignado a esa


variable.
 get_class_methods(clase), que devuelve una matriz con los valores
actuales de todas las funciones incluidas en la clase.
 get_object_var(objeto), que devuelve el nombre y el contenido de todas
la variables contenidas en un objeto.

Cómo llamar a una función de una clase sin crear un objeto

En PHP también es posible llamar a una función definida dentro de una clase
sin que sea necesario crear previamente un objeto. Para ello, hay que usar el
símbolo :: de la forma siguiente:

clase :: funcion

Esta instrucción funciona exactamente igual que si creáramos un objeto y


desde él invocáramos la función correspondiente de esta forma:

$objeto = new clase


$objeto->funcion ()

Veamos un ejemplo de cómo podemos utilizar ::

<?

class X
{
public static function mensaje()
{
echo "Esta función muestra un texto<br>";
}
}

// Aquí llamamos a la función sin crear un objeto previo.


X::mensaje();

// Pero también podemos crear un objeto


// e invocar la función a través de él.
$mensa = new X;
$mensa->mensaje();

?>

Fíjate que hemos usado la palabra reservada static antes de function dentro
de la clase. Declarar variables o funciones de clases como estáticos, los hace
accesibles desde afuera del contexto del objeto sin necesidad de crear el
objeto previamente. Debido a que los métodos estáticos son accesibles sin que
se haya creado una instancia del objeto, la pseudo variable $this no está
disponible dentro de los métodos declarados como estáticos.

Veamos ahora un sencillo ejemplo de clase. Se trata de una calculadora


elemental, que realiza las operaciones suma, resta, producto y división.

- 209 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

En el Ejemplo 5 de esta Unidad hemos creado dos clases y dos objetos


parecidos (clases: $calculadora1 y $calculadora2, objetos: $calculos1 y
$calculos2) para que se vea cómo pueden pasarse los valores que son los
parámetros tanto desde la instrucción donde se crea el objeto como desde la
utilización de sus propiedades y métodos. El programador o programadora sólo
debe saber que, para poder usar cada clase, ha de pasarle dos valores
numéricos al crear el objeto (primera) o al utilizar sus métodos (segunda).

En el Ejemplo 5 de esta Unidad hemos creado otra clase $calculadora3 que


hereda de $calculadora1 todos las propiedades y métodos, e incorpora un
nuevo método, propio, para hallar el cuadrado del número que recibe como
primer argumento.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 5 (Calculadora)


de la Unidad 3. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

Finalmente, recordamos que las posibilidades de PHP 5 respecto a la POO son


muy amplias. En este apartado hemos visto una introducción básica sobre las
clases necesaria para este curso de iniciación. PHP 5 presenta además las
siguientes características:

 Auto carga de las Objetos.


 Constantes en Objetos.
 Abstracción de Objetos.
 Interfaces de Objetos.
 Sobrecarga de variables y funciones.
 Interacción de Objetos.
 Patrones.
 Métodos mágicos.
 La palabra reservada 'Final'.
 Clonado de Objetos.
 Comparación de Objetos.
 Reflexión.
 Type Hinting.

Si el alumno o alumna desea ampliar sus conocimientos sobre POO puede


utilizar el Manual de PHP o bien apuntarse a un curso avanzado de PHP.

En el Ejemplo 7 de esta Unidad hemos creado una clase que gestiona la


información de una Biblioteca mediante sus propiedades y métodos. Es
importante que estudies el contenido del código fuente ya que muestra de
forma práctica lo que hemos visto en este apartado.

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 7 (Biblioteca) de la


Unidad 3. Estudia el código fuente y ejecútalo para mostrar en el navegador
su resultado.

- 210 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Resumen

Hay que saber al final de esta unidad

 Adaptar al contexto cadenas con las funciones


addSlashes(), tripSlashes(), urldecode(),
urldecode() y nl2br().

 Limpiar cadenas con chop(), ltrim(), trim() y


strip_tags().

 Poner en letras mayúsculas o minúsculas cadenas


completas o parcialmente con strtoupper(),
strtolower(), ucfirst() y ucwords().

 Hallar la longitud de una cadena con strlen().

 Repetir cadenas con str_repeat().

 Modificar cadenas con strtr().

 Buscar en el interior de las cadenas con


strcspn(), strspn(), strpos(), strrpos(),
strrchr() y strstr().

 Tratar subcadenas con substr(), substr_replace(),


strtok() y parse_str().

 Invertir el texto de una cadena con strrev().

 Comparar cadenas con strcasecmp() y strcmp().

 Utilizar correctamente las funciones chr(), ord()


y number_format().

 Establecer categorias locales con setlocale().

 Comprobar la validez de una fecha con checkdate().

 Dar formato a una fecha con date() y strftime().

- 211 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

 Extraer correctamente información de una fecha con


getdate() y mktime().

 Leer una fecha desde una página web.

 Crear e inicializar matrices con array() y


range().

 Recorrer los elementos de las matrices con


reset(), end(), count(), next(), prev(),
current(), key(), eahc() y list().

 Convertir cadenas en matrices y viceversa con


explode() e implode().

 Ordenar matrices con arsort(), rsort(), asort(),


krsort(), ksort(), shuffle(), uasort(), usort() y
uksort().

 Modificar matrices con array_merge(), array_pad(),


array_reverse(), array_splice(), array_walk() y
array_compact().

 Extraer información de las matrices con


array_count_values(), array_keys(), array_slice(),
array_values(), extract() e in_array().

 Tratar una matriz como una pila con array_pop(),


array_push(), array_shift() y array_unshift().

 Crear y utilizar correctamente funciones de


usuario.

 Crear y utilizar correctamente clases y objetos.

- 212 -
MÓDULO 2

Operaciones con ficheros y


directorios

Unidad 4

Índice de la unidad:

1. Abrir y cerrar ficheros

2. Recorrer ficheros y leer su contenido

3. Modificar el contenido de los ficheros

4. Copiar, borrar y renombrar ficheros

5. Operaciones con directorios

6. Otras operaciones con ficheros y directorios

7. Resumen
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Introducción
En esta Unidad vamos a aprender a abrir y a cerrar ficheros, así como
saber mostrar su contenido.

Aplicaremos las funciones que permiten recorrer ficheros y leer su


contenido.

También, modificaremos el contenido de los ficheros, así como copiar,


borrar, renombrar y conocer sus atributos.

Finalmente, sabremos aplicar las funciones que permiten subir ficheros al


servidor y bajarlos, así como validarlos.

Abrir y cerrar ficheros


En esta Unidad 4 vamos a abordar el tratamiento de los ficheros en PHP.
Hasta el momento la información que escribíamos se perdía al cerrar el
navegador o bien debíamos guardarla en el código fuente PHP. Pero esto
último, en realidad, no es recomendable hacerlo cuando se trata de una
aplicación PHP real cuyo código está en el servidor y el cliente no tiene acceso
al mismo sino como mero usuario que se beneficia de su interpretación. Sólo
puede hacerlo el dueño de la aplicación de acuerdo con el administrador del
servidor.

Sin embargo, PHP permite guardar y recuperar información a través de los


ficheros, para lo cual dispone de funciones y procedimientos para acceder a los
mismos y a su información, así como para crearlos, destruirlos, modificar su
contenido, etcétera. PHP también puede tratar las carpetas o directorios.

En esta la Unidad, pues, vamos a estudiar de forma teórico-práctica las


diferentes operaciones que se pueden llevar a cabo con los directorios y con
los ficheros. Concretamente, en este primer apartado abordamos cómo abrir y
cómo cerrar ficheros.

En el Manual de PHP aparecen multitud de funciones de ficheros. En este


apartado nos vamos a limitar a explicar brevemente las más frecuentes y
necesarias. Nuestro objetivo es que el alumno aprenda a utilizar algunas para
familiarizarse con ellas y poder, luego, utilizar correctamente las que necesite
obteniendo información en el Manual.

Obtener el directorio por defecto

Mediante la función getcwd() se obtiene el directorio actual en donde se está


trabajando. Es decir, se trata del directorio donde se encuentra el script que
estemos ejecutando.

- 215 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Establecer el directorio por defecto

Aunque la función chdir() pertenece al apartado donde se trata el trabajo con


los directorios, se explica aquí por necesidad. Todas las operaciones con
ficheros que realice el alumno o alumna han de llevarse a cabo sobre los
ficheros presentes en su directorio de trabajo. Por eso, conviene que en todos
sus scripts inserte como primera línea de código esta función para fijar el
directorio donde están o deben crearse los ficheros con los que se va a
trabajar.

La función chdir() establece el directorio actual por defecto donde están


archivados o donde se van a archivar los ficheros que se utilicen para realizar
diferentes operaciones. Al ejecutarse, comprueba si el directorio pasado como
argumento existe o no. En el primer caso esta función devuelve True; en el
segundo, False. Una vez que se ha establecido el directorio por defecto, si el
camino especificado existe, ya no es necesario indicar delante del nombre de
fichero el directorio donde debe buscarse o crearse los ficheros que se usen en
el mismo script.

Su sintaxis es la siguiente:

chdir(“nombre completo de directorio”);

La mejor forma de usar esta función es incluyéndola dentro de una estructura


condicional de la forma siguiente:

if (chdir($directorio_trabajo))
echo "El directorio \"$directorio_trabajo\" existe y ha quedado
fijado como actual.</TD></TR>";
else
die ("El directorio \"$directorio_trabajo\" no existe y no se
ha podido fijar como actual. NO SE CONTINUA LA
EJECUCUION.</TD></TR>");

Puede verse cómo funciona este código en el Ejemplo 1 de esta Unidad.

Abrir un fichero

Siempre que trabajemos con ficheros para escribir, modificar o leer su


contenido, es imprescindible realizar un proceso que está integrado, al menos,
por tres operaciones:

1. Abrir el fichero.

2. Realizar las operaciones de lectura o escritura previstas.

3. Cerrar el fichero.

La función fopen() permite abrir un fichero para trabajar con el mismo. Al


ejecutarse, comprueba si el fichero pasado como primer argumento existe o no.

- 216 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

En el primer caso esta función devuelve True; en el segundo, False. Por ello,
conviene incluir también esta función dentro de una estructura condicional que
nos informe de la apertura o no del fichero especificado.

Ésta es su sintaxis:

fopen("nombre del fichero","modo de apertura",


entero para mirar también en el camino fijado
en la instrucción include);

donde

El primer parámetro es el nombre exacto del fichero que se desea abrir. Si


dentro de este argumento se indica el directorio por no haber usado
previamente la función chdir(), es imprescindible poner las dos barras \\, para
que la barra de directorio sea interpretada correctamente, es decir, como signo
textual de directorio y no como un símbolo del lenguaje HTML.

El segundo parámetro es el modo de apertura, que debe ponerse también entre


comillas. Un fichero puede abrirse de varios modos, cada uno de los cuales se
indica con el signo correspondiente:

 'r' - Abre el fichero para sólo lectura; sitúa el puntero del fichero al
comienzo del mismo.
 'r+' - Abre el fichero para lectura y escritura; sitúa el puntero del fichero
al comienzo del fichero.
 'w' - Abre el fichero para sólo escritura; sitúa el puntero del fichero al
comienzo del fichero y trunca el fichero con longitud cero. Si el fichero no
existe, trata de crearlo.
 'w+' - Abre el fichero para lectura y escritura; sitúa el puntero del fichero
al comienzo del mismo y trunca el fichero con longitud cero. Si el fichero
no existe, trata de crearlo.
 'a' - Abre el fichero sólo para escribir (añadir); sitúa el puntero del fichero
al final del mismo. Si el fichero no existe, trata de crearlo.
 'a+' - Abre el fichero para lectura y escritura (añadiendo); sitúa el puntero
del fichero al final del mismo. Si el fichero no existe, trata de crearlo.

Además de uno de los anteriores, este argumento, denominado mode, puede


contener la letra 'b'. Esto es útil para sistemas que diferencian entre ficheros
binarios y de texto, como Windows. Es inútil en Unix. Si no se necesita, es
ignorado.

El tercer parámetro, opcional, permite indicar que la búsqueda del fichero se


haga también en el camino donde se hallan los ficheros especificados en la
orden include. En este caso, hay que poner el valor 1.

Veamos un ejemplo:

if (fopen("Ficheros_1.php","r"))
echo "<B>El fichero \"Ficheros_1.php\" existe

- 217 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

y ha quedado abierto.</B>";
else
echo "<B>El fichero \"Ficheros_1.php\" no existe.</B>";

En las instrucciones anteriores se intenta abrir el fichero Ficheros_1.php en


modo de sólo lectura especificando que, si se puede abrir, el puntero quede al
principio del mismo.

Conviene observar que, al igual que ocurre con las matrices, en los ficheros
también hay un puntero o apuntador que señala una de las posiciones del
fichero.

Si no se hubiera usado antes la función chdir(), sería preciso haber escrito:

if (fopen(($directorio_trabajo ."/fichero1.php", "r"))

En lugar de poner una estructura de control condicional, también es posible


utilizar una sintaxis más elegante usando la función die(), que permite
devolver un mensaje al navegador del cliente y da por finalizado el script que
se está interpretando. Así quedaría el código en este caso:

@fopen("Fichero_1.php","r") or
die("<B>El fichero \"Fichero_1.php\" no se ha podido abrir.</B><P>");

De esta forma, más elegante y eficaz, se consigue evitar el mensaje de error


que se envía al cliente (por eso hemos usado el operador @) y se dejan de
ejecutar las siguientes líneas del código (gracias a la función die()). Si el
fichero existe y puede abrirse, no se muestra el mensaje y se prosigue con la
interpretación de las siguientes líneas de código.

Puede verse cómo funciona este código en el Ejemplo 1 de esta Unidad.


Como el fichero citado (Fichero_5.php) no existe, hemos comentado estas
líneas de código para que puedan seguir ejecutándose las siguientes
instrucciones. Si se quiere ver de hecho cómo funciona, el alumno puede quitar
los signos del comentario desde Eclipse PDT. Si no los vuelve a poner, no se
interpretará nunca el resto de las líneas que aparecen en el ejemplo completo.

La forma más frecuente de citar el nombre de un fichero y su identificador es


usando dos variables, una para que contenga el nombre del fichero y otra para
que contenga el identificador del mismo. Mira el siguiente código:

$fichero1="Ficheros_1.php";
$id_fichero1=@fopen($fichero1,"r")
or die("<B>El fichero \"Fichero_1.php\" no se
ha podido abrir.</B><P>");
echo "<B>El fichero \"Ficheros_1.php\" existe y ha quedado
abierto en modo lectura.</B><P>";

En la variable $fichero1 hemos guardado el nombre del fichero; la variable


$id_fichero1 contiene el identificador de fichero. Para realizar cualquier
operación con este fichero abierto, debemos utilizar el identificador creado.

- 218 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Si se pretende abrir un fichero en modo escritura y no existe, se intenta crear el


fichero especificado. Si existe, es preciso tener mucho cuidado con el
parámetro mode que se utilice, ya que “w” y “w+” truncan el fichero dejando
su tamaño a cero y colocando el puntero al principio del fichero. Esto quiere
decir que se perderá su contenido anterior. En cambio, “a” y “a+” no truncan
el fichero y colocan el puntero al final del fichero. Por lo tanto, el contenido
nuevo se añadirá a lo que ya había.

En el Ejemplo 1 pueden verse varias operaciones de este tipo y sus


resultados. Conviene abrir con Eclipse PDT los ficheros Ficheros_2.txt (una
vez creado) y Ficheros_3.txt después de realizar cada una de estas
operaciones, para ver su contenido y comprender bien cómo funciona cada
parámetro mode.

$fichero2="Ficheros_2.txt";

$id_fichero2=@fopen($fichero2,"w");

Con estas dos instrucciones, si el fichero Ficheros_2.txt no existía, se crea


con tamaño 0; si ya existía y tenía contenido, se deja vacío.

$fichero3="Ficheros_3.txt";

$id_fichero3=@fopen($fichero3,"a");

Con estas dos instrucciones, si el fichero Ficheros_3.txt existía, se abre y se


deja el puntero al final del mismo, disponible para añadir más contenidos; si no
existía, se crea con tamaño 0 también disponible para añadir contenidos.

Cerrar un fichero

Todo fichero que ha sido abierto debe ser cerrado una vez que se ha acabado
de realizar con él las operaciones previstas.

La función fclose() permite cerrar los ficheros abiertos. Su sintaxis es


sencilla:

fclose(nombre de identificador);

Se cierra sólo el fichero del identificador que se especifique. Al ejecutarse esta


función, se comprueba si el fichero pasado como argumento está abierto y lo
ha podido cerrar o no. En el primer caso esta función devuelve True; en el
segundo (si el fichero no existe o no está abierto), False.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 1 (Abrir


ficheros) de la Unidad 4. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

- 219 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas.

- 220 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Recorrer ficheros y leer su contenido

En este apartado de la Unidad 4 vamos a explicar cómo se recorre un fichero


en PHP. Muchas veces es necesario mover el puntero de ficheros a una
posición determinada desde otra previa para leer su contenido o para
modificarlo o insertar algún texto. PHP tiene también funciones que permiten
mover el puntero por el contenido de los ficheros.

Recorrer un fichero

La función rewind() sirve para colocar el puntero de acceso a los ficheros en la


primera posición. Ya hemos visto que, cuando se abre un fichero, algunos
parámetros de su argumento mode colocan el puntero en la primera posición,
pero, a lo largo de diversas operaciones con el mismo, puede suceder que no
sepamos dónde está el puntero. Para colocarlo en la primera posición,
debemos usar rewind(). Para poder realizar esta operación, lógicamente, el
fichero debe estar abierto.

Su sintaxis es la siguiente:

rewind("nombre completo del fichero" o identificador);

Por ejemplo, la instrucción rewind("Ficheros_1.php"); coloca el puntero de


ese fichero en la primera posición.

La función fseek() se utiliza para mover el puntero tantas posiciones hacia


delante (si el segundo argumento es un número positivo) o hacia atrás (si es un
número negativo) como se indique en su segundo argumento. Tiene una
sintaxis también sencilla:

fseek("nombre completo del fichero" o identificador,


número de posiciones que hay que saltar);

Por ejemplo, la instrucción fseek("Ficheros_1.php",75); coloca el puntero del


fichero en el carácter (byte) que ocupa la posición 75.

La función ftell() se utiliza para conocer en qué posición del fichero está el
puntero. Tiene esta sintaxis:

ftell("nombre completo del fichero" o identificador);

Devuelve un número entero y se usa cuando se desconoce la posición del


puntero. Suele combinarse con la función fseek() para desplazar el puntero de
forma relativa.

Por ejemplo, la instrucción ftell("Ficheros_1.php"); escrita después de


fseek("Ficheros_1.php",75); devuelve el valor 75.

- 221 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Si queremos mover el puntero de forma relativa diez posiciones adelante,


escribiremos la instrucción

fseek("Ficheros_1.php",ftell("Ficheros_1.php")+10);

La función feof() se utiliza para detectar si se ha sobrepasado la última


posición del fichero, es decir, si se ha alcanzado la marca de final de fichero.
Tiene esta sintaxis:

feof("nombre completo del fichero" o identificador);

Devuelve el valor lógico True si se ha alcanzado la marca de final de fichero o


False si no se ha hecho.

Por ejemplo, la instrucción feof("Ficheros_1.php"); escrita después de


fseek("Ficheros_1.php",5000); devuelve el valor True, ya que el fichero tiene
menos de 5.000 caracteres (bytes) y, por tanto, se encuentra la marca de final
de fichero.

Esta función es muy útil para leer uno a uno o línea a línea todos los
caracteres de un fichero usando un bucle while (!feof()), como estudiaremos
más adelante.

Puede verse cómo se usan las funciones explicadas en el Ejemplo 2 de esta


Unidad.

Leer los contenidos de un fichero

Hasta ahora sólo hemos accedido a un fichero y nos hemos movido por sus
caracteres, posiciones o bytes, pero en ningún momento hemos visto o
modificado su contenido. Veamos ahora cómo podemos leer un fichero.

La función fread() se utiliza para leer una cadena de un fichero abierto. Tiene
esta sintaxis:

fread("nombre completo del fichero" o identificador,


número de caracteres que se deben leer);

Si se alcanza la marca de final de fichero (feof()) antes de leer todos los


caracteres indicados, se lee hasta el final del mismo, si bien no se produce
ningún error al llegar al final de fichero.

Por ejemplo, la instrucción fread("Ficheros_3.txt",25) devuelve los 25


primeros caracteres de este fichero, pues el puntero después de abrir el fichero
con el parámetro “r” estaba al comienzo del mismo. Además, el puntero se
desplaza a la posición 26, por cual una segunda lectura parte desde esta
posición.

Puede verse el uso de esta función en el Ejemplo 2 de esta Unidad.

- 222 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

La función fgets() hace exactamente lo mismo que la función fread() y lleva


los mismo parámetros como argumentos. Sólo se diferencian en que la función
fgets() sólo lee una cadena que, como máximo, abarca hasta que encuentre
la marca de final de línea (retorno de carro). Por ello, si el número del segundo
parámetro es superior a los caracteres de una línea, la cadena que se lee
comprenderá sólo el texto de la línea.

Con esta función incluida dentro de un bucle podemos leer línea a línea un
fichero de esta forma:

rewind("Ficheros_3.txt");
while (!feof("Ficheros_3.txt"))
{
$linea=fgets("Ficheros_3.txt",256);
echo "<B>$linea </B><P>";
}

Conviene advertir que, cuando se ejecutan las funciones anteriores, la cadena


contiene una posición menos que la indicada en el argumento, es decir, si
ponemos 10 como longitud de la cadena, se muestran 9 caracteres. Esto se
debe a los códigos de salto de línea, que se leen también, aunque no se
muestran.

La función fgetss() hace exactamente lo mismo que la función fgets(), pero


en la lectura prescinde de las etiquetas propias del lenguaje HTML. Su sintaxis
es la siguiente:

fgetss("nombre completo del fichero" o identificador,


número de caracteres que se deben leer,
"etiquetas que pueden leerse");

El uso de esta función también puede verse en el Ejemplo 2 de esta Unidad.

La función fgetc() se utiliza para leer un carácter de un fichero abierto a partir


de la posición del puntero. Tiene esta sintaxis:

fgetc("nombre completo del fichero" o identificador);

Por ejemplo, la instrucción fgetc("Ficheros_3.txt") devuelve el carácter de


este fichero sobre el que esté el puntero. Éste también se desplaza una
posición.

Usando esta función dentro de un bucle que recorra desde la primera posición
hasta la marca de final de fichero puede mostrarse el contenido completo de
éste.

Puede verse el uso de esta función en el Ejemplo 2 de esta Unidad.

La función file() también se usa para leer un fichero y asignar el texto de


cada línea a una matriz. La primera línea se coloca como elemento 0 y así
sucesivamente. En este caso el identificador que se pasa como argumento es

- 223 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

el propio nombre del fichero y la función count() permite saber cuántos


elementos tiene la matriz para poder recorrerla posteriormente. Veamos un
ejemplo:

$matriz=file("Ficheros_3.txt");
for ($i=0;$i<count($matriz);$i++)
{
print ("<B> Elemento $i:</B> $matriz[$i]<P>");
}

La función readfile() permite también leer un fichero y enviar su contenido a


la página del cliente. Tiene la siguiente sintaxis:

readfile("nombre completo del fichero", camino de la orden include);

El segundo argumento es opcional e indica, si se pone, que el fichero se


busque también en los directorios citados en la cláusula include.

Prácticamente hace lo mismo la función fpassthru(). Esta función devuelve


True si se ha podido realizar la operación y False si no se ha hecho.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 2 (Leer ficheros)


de la Unidad 4. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas.

- 224 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Modificar el contenido de los ficheros


En este apartado de la Unidad 4 vamos a explicar cómo se modifica el
contenido de los ficheros en PHP. Este lenguaje dispone también de funciones
que permiten modificar el contenido de los ficheros.

Modificar el contenido de un fichero

La función fputs() sirve para escribir en el fichero especificado una cadena de


caracteres del tamaño que se indique. Para poder realizar esta operación,
lógicamente, el fichero debe estar abierto. Esta función devuelve el valor lógico
True si se ha podido realizar la operación sin problema o False si no se ha
podido.

Su sintaxis es la siguiente:

fputs("nombre completo del fichero" o identificador,


cadena que se escribe,tamaño de la cadena);

El tercer argumento es opcional. Si no se pone, se escribe la cadena completa.


Si se indica, sólo se escribe el número de caracteres señalado.

Para que esta operación funcione correctamente es preciso utilizar bien el


modo de apertura del fichero. Si ha de añadirse el texto por el principio del
fichero, debemos usar el parámetro de apertura “r+”; si necesitamos añadir el
texto por el final, usaremos los parámetros de apertura “a” o “a+”; si queremos
sustituir el contenido completo del fichero, hay que poner los parámetros de
apertura “w” o “w+”.

Por ejemplo, la instrucción fputs("Ficheros_2.php","Nuevo texto");


suponiendo que el fichero se ha abierto con el parámetro “r+”, añade el texto
al principio del fichero indicado sustituyendo los caracteres originales que éste
ocupe.

La función fwrite() es idéntica a fputs() y su sintaxis lleva los mismos


argumentos, que se comportan igual que en la función explicada. Así pues,
puede usarse también en lugar de la anterior.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 3 (Escribir en


fichero) de la Unidad 4. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas y otros nuevos.

- 225 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Copiar, borrar y renombrar ficheros. Conocer sus


atributos
En este apartado de la Unidad 4 vamos a explicar otras operaciones que
también pueden llevarse a cabo en PHP con los ficheros: copiarlos,
renombrarlos, borrarlos y conocer sus atributos.

Copiar un fichero

La función copy() sirve para hacer una copia física de un fichero en otro. Para
poder realizar esta operación, el fichero original no debe estar abierto. Esta
función devuelve el valor lógico True si se ha podido realizar la operación sin
problemas o False si no se ha podido.

Su sintaxis es la siguiente:

copy("nombre del fichero original", "nombre del fichero destino");

Por ejemplo, copy("Ficheros_2.txt","Ficheros2_2.txt"); hace una copia


exacta del primero en el segundo.

En el Ejemplo 4 de esta Unidad pueden verse varias operaciones con esta


función y las siguientes de este apartado.

Si el fichero destino existe, es sustituido automáticamente. Por eso, conviene


combinar la función copy() con la función file_exists(), que detecta si un
fichero existe, para no sustituir involuntariamente el contenido de un fichero con
el de otro. Así se hace en el Ejemplo 4.

La función unlink() sirve para borrar físicamente un fichero. Para poder


realizar esta operación, el fichero original no debe estar abierto. Esta función
devuelve el valor lógico True si se ha podido realizar la operación sin problema
o False si no se ha podido.

Su sintaxis es la siguiente:

unlink("nombre del fichero que debe borrarse");

Por ejemplo, la instrucción unlink("Ficheros_2.txt"); elimina el fichero


especificado. Si no se ha fijado con chdir() el directorio actual, hay que indicar
delante del nombre del fichero el camino completo donde se halla.

Para evitar errores, conviene combinar la función unlink() con la función


file_exists(), como hemos hecho con la función copy().

La función rename() sirve para cambiar el nombre de un fichero. Para poder


realizar esta operación el fichero original no debe estar abierto. Esta función

- 226 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

devuelve el valor lógico True si se ha podido realizar la operación sin


problemas o False si no se ha podido.

Su sintaxis es la siguiente:

rename("nombre del fichero original","nuevo nombre del fichero");

Por ejemplo, rename("Nuevo.txt","Ficheros_2.txt"); cambia el nombre del


fichero original por el nuevo nombre.

Si ya hay un fichero con el mismo nombre, la operación no se lleva a cabo. Por


eso, conviene combinar la función rename() con la función file_exists(), tanto
para comprobar que existe el fichero original como para comprobar que no
existe otro con el nombre que se le quiere poner. Así se hace en el Ejemplo 4.

Conocer los atributos, el tipo y el tamaño de un fichero

Las tres operaciones que hemos explicado antes sólo pueden ejecutarse si el
fichero, caso de que exista, tiene el atributo de sólo lectura en estado de False.
Además, es preciso saber otras cosas para poder tratar un fichero, como si
existe o no, si el nombre indicado es un de un fichero o de un directorio y el tipo
de fichero que es. Todo esto lo vamos a ver en este apartado.

La función filesize() devuelve el tamaño de un fichero expresado en número


de bytes.

La función filetype() devuelve el tipo del fichero pasado como argumento.


Según el nombre pasado como argumento, los tipos que puede devolver esta
función son:

 file: es un fichero normal.


 dir: es un nombre de directorio.
 link: es un enlace simbólico (sólo en sistema UNIX).
 fifo: es una pila de tipo FIFO.
 char: es en dispositivo de tipo carácter, por ejemplo “C:\”.
 block: es un dispositivo de bloque.
 unknown: tipo desconocido.

La función is_dir() devuelve True si es un directorio y False si no lo es o no


existe.

La función is_executable() devuelve True si es un fichero ejecutable por el


cliente que accede al mismo y False si no lo es o no existe.

La función is_file() devuelve True si es un fichero normal y False si no lo es


o no existe.

La función is_link() devuelve True si es un enlace simbólico y False si no lo


es o no existe.

- 227 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

La función is_writable() devuelve True si es un fichero en el que se puede


escribir y False si no lo es o no existe.

La función is_readable() devuelve True si es un fichero que se puede leer y


False si no lo es o no existe.

La función stat() devuelve una matriz con 13 elementos que contienen


información sobre el fichero, si existe. Concretamente, se informa de los
siguientes aspectos: dispositivo, i-nodo, permisos, número de enlace,
propietario, grupo, tipo de dispositivo, tamaño, instante del último acceso,
instante de la última modificación, instante del último cambio, tamaño del
bloque y número de bloques asignados. Como se ve, es una información más
bien adecuada para el administrador de un servidor. Además, algunas
informaciones sólo son propias del sistema Linux, por lo que Windows devuelve
el valor –1.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 4 (Gestionar


fichero) de la Unidad 4. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas y otros nuevos.

- 228 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Operaciones con directorios


Obtener el directorio por defecto

Mediante la función getcwd() se obtiene el directorio actual en donde se está


trabajando. Es decir, se trata del directorio donde se encuentra el script que
estemos ejecutando.

Fijar un directorio del servidor por defecto

Ya hemos estudiado y practicado suficiente con la función chdir(), que permite


establecer un directorio como actual o por defecto. Nos remitimos a las
explicaciones dadas en el apartado Abrir y cerrar ficheros. Una vez fijado
este directorio, cualquier referencia a un fichero se buscará aquí, si no se
especifica otro camino donde deba hacerse.

Abrir un directorio

La función opendir() permite entrar en un directorio del servidor y tener acceso


a sus ficheros y subdirectorios. Es imprescindible abrir un directorio para,
después, poder cerrarlo con closedir(), leer sus ficheros con readdir() o
mover el puntero de lectura de un directorio con rewinddir().

Su sintaxis es la siguiente:

opendir("camino completo de directorio");

Esta función devuelve un identificador de directorio que nos servirá después


para hacer referencia a ese directorio, como ocurre con los ficheros.

Por ejemplo, opendir("cursoPHP5"); abre este directorio. Para que nos


devuelva un identificador que necesitaremos después, lo mejor es escribir:

$id_dircurso=opendir("cursoPHP5");

Además, como hemos hecho en los ficheros, recomendamos la siguiente


estructura, ya usada y explicada en los ficheros:

$id_dircurso= @opendir($_SERVER['DOCUMENT_ROOT']."/curso/")
or die("<B>El directorio \"/curso/\" no se ha podido
abrir.</B><P>");

En el comando anterior hemos utilizado la variable global


$_SERVER['DOCUMENT_ROOT'] que indica el directorio raíz del servidor web. Por
ejemplo, en C:\xampp\htdocs.

Es importante tener en cuenta que, al escribir el camino, la barra \ debe


escribirse doble, si bien recomendamos usar mejor la barra única / compatible
en todos los sistemas operativos.

- 229 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

PHP dispone también de una clase que nos permite acceder y tratar los
directorios. Es la clase dir(). Para abrir un directorio funciona igual que
opendir(). Además, tiene dos propiedades, que son handle (puntero) y path
(camino), y tres métodos, que son read() (leer el nombre de un fichero o
subdirectorio), rewind() (llevar el puntero al principio de directorio) y close()
(cerrar el directorio). Dentro de esta clase pueden usarse, además, las
funciones estándar de manejo de directorios. En la Unidad anterior se explican
las clases, donde el alumno puede repasar estos contenidos, si lo necesita.

Ver cómo se usa esta clase en el Ejemplo 5.

Cerrar un directorio

La función closedir() permite cerrar un directorio del servidor. El directorio


debe haber sido abierto previamente.

Su sintaxis es la siguiente:

closedir("nombre del identificador de directorio");

Leer un directorio

La función readdir() permite leer los ficheros o directorios del directorio


abierto.

Su sintaxis es la siguiente:

readdir("nombre del identificador de directorio");

Esta función lee el nombre del fichero o directorio sobre el que esté el puntero
y avanza éste al siguiente. Lo normal es usar esta función dentro de un bucle
que vaya leyendo uno a uno los elementos (ficheros o subdirectorios) del
directorio.

Por ejemplo, podemos recorrer un directorio completo de la forma siguiente:

$id_dircurso= @opendir($_SERVER['DOCUMENT_ROOT']."/curso/")
or die("<B>El directorio \"/curso/\" no se ha podido
abrir.</B><P>");

echo "<B>Hemos abierto el directorio del servidor: ".


$_SERVER['DOCUMENT_ROOT']."/curso/</B><P>";

$directorio = dir($directorio_trabajo);
// Aquí creamos un objeto de la clase dir().
echo "Puntero: <B>".$directorio->handle."</B><P>";echo "Camino:
<B>".$directorio->path."</B><P>";
while($fichero=$directorio->read())
{
echo "$fichero<P>";
}
$directorio->close();

- 230 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

La clase dir() también permite leer un directorio, como hemos explicado


antes.

Mover el puntero de lectura de un directorio

La función rewinddir() lleva el puntero de lectura de un directorio al principio


de éste, para poder leerlo completo si el puntero se había desplazado
anteriormente.

Su sintaxis también es sencilla:

rewinddir("nombre del identificador de directorio");

En el Ejemplo 5 de esta Unidad pueden verse varias operaciones con estas


funciones y las siguientes de este apartado.

Crear un directorio

La función mkdir() permite crear un directorio dentro del directorio actual. La


sintaxis es sencilla:

mkdir("nombre del nuevo directorio",entero octal de modo);

En UNIX hay que poner un segundo parámetro (número entero en base octal),
que indica el modo o permisos de creación. No es el caso de este curso. En
Windows debemos poner 0 en este parámetro.

Esta función devuelve el valor lógico True si se ha podido realizar la operación


sin problema o False si no se ha podido. Si no hay un directorio establecido
como actual, es preciso poner el camino completo del directorio que se quiere
crear.

Por ejemplo, las instrucciones

$nuevo_dir="Pruebas";

mkdir($nuevo_dir,0);

crean el directorio “Pruebas” dentro del directorio del proyecto PHP. Desde
Eclipse PDT, con la tecla F5 para actualizar el proyecto, puede comprobarse
que realmente se ha creado.

Si el directorio ya existe, se produce un error. Por eso, al igual que ocurre con
los ficheros, conviene comprobar con la función file_exists() si ya existe,
para no intentar crearlo en este caso.

Borrar un directorio

La función rmdir() permite borrar un directorio. Su sintaxis es también sencilla:

- 231 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

rmdir("nombre del directorio que se quiere borrar");

Esta función devuelve el valor lógico True si se ha podido realizar la operación


sin problema o False si no se ha podido. Si no hay un directorio establecido
como actual, es preciso poner el camino completo del directorio que se quiere
eliminar. Para poder borrarse, el directorio debe existir y estar vacío.

Por ejemplo, las instrucciones

$directorio="Pruebas";

rmdir($nuevo_dir);

eliminan el directorio “Pruebas” dentro del anterior proyecto. Desde Eclipse


PDT, con la tecla F5 para actualizar el proyecto, puede comprobarse que
realmente se ha eliminado.

Si el directorio no existe o no está vacío, se produce un error. Por eso, al igual


que ocurre con los ficheros, en esta operación conviene comprobar con la
función file_exists() si existe, con el signo @ para evitar el mensaje si no
existe y con die() para mostrar un mensaje propio si existe, pero no está
vacío. Ésta sería una forma elegante de hacerlo:

$directorio="Pruebas";

if (file_exists($directorio)) @rmdir($directorio)
or die("<B>El directorio \"Pruebas\" no se ha podido borrar
al no estar vacío.</B><P>");

Si el problema consiste en que no está vacío, hay que eliminar todos los
ficheros con la función unlink() antes de intentar borrar el directorio.

Mediante Eclipse PDT puedes abrir el proyecto Ejemplo 5 (Gestionar


directorios) de la Unidad 4. Estudia el código fuente y ejecútalo para
mostrar en el navegador su resultado.

Subir ficheros al servidor, usarlos y validarlos

Con PHP el cliente de una página web también puede subir ficheros al servidor
desde su ordenador, es decir, se puede convertir en emisor de información.

La forma más frecuente de hacerlo es rellenando formularios con la información


que el website le pida, sea ésta personal, profesional o económica, a fin de
conseguir algo, como obtener datos sobre algo que le interesa, comprar algún
producto, apuntarse en un servicio, etcétera. Los datos que el usuario envía al
servidor suelen ser de tipo texto. Cuando se reciben en su destino, se procede
con ellos como convenga según la finalidad de la aplicación.

- 232 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Pero también es posible en PHP enviar ficheros al servidor, en formato texto o


binario. Por ejemplo, se puede remitir un fichero con el currículum vitae o una
fotografía, etcétera.

Vamos a estudiar los pasos que se dan cuando se sube un fichero al servidor:

1. Mediante un formulario se pregunta el nombre del fichero. En el Ejemplo 6


de esta Unidad se usa el script index.php para preguntar el fichero que se
quiere subir. Explicamos brevemente el código, que está compuesto
exclusivamente por etiquetas HTML.

<?

include "uni4_eje6_configura.php";
echo "<FORM ENCTYPE=multipart/form-data METHOD=post ACTION=$destino>
Nombre del fichero: <INPUT TYPE=File NAME=fichero SIZE=35>
<INPUT TYPE='hidden' name='MAX_FILE_SIZE' VALUE='51200'>
<INPUT TYPE=submit NAME=submit VALUE=Subir_al_Servidor>";
?>

En primer lugar, se usa la orden include para acceder a los datos de un fichero
de configuración (uni4_eje6_configura.php) donde hemos definido e
inicializado algunas variables que usaremos luego en este script, como
$destino, en la que se guarda el nombre del script que debe ejecutarse para
subir el fichero elegido al servidor ("uni4_eje6_sube.php") y otras que se usan
también en este último fichero, como $directorio, que es el destino del fichero
que se sube o $fr_repetida, donde se guarda la frase que se muestra al
usuario si el fichero no se ha podido subir por haber uno ya en el servidor con
el mismo nombre.

Conviene observar que el script uni4_eje6_configura.php se incluye también


en el script "uni4_eje6_sube.php".

Las etiquetas HTML nuevas son:

 ENCTYPE=multipart/form-data para poder examinar directorios al


seleccionar el fichero que se quiere subir.
 TYPE=File para indicar que el tipo de dato que se va a pasar al script
uni4_eje6_sube.php es un fichero.
 TYPE='hidden' name='MAX_FILE_SIZE' VALUE='51200' para definir una
entrada oculta (hidden) al usuario de la página en la que se fija que el
tamaño máximo (MAX_FILE_SIZE) del fichero debe ser de 50 Kb.

Cuando se selecciona un fichero y se pulsa sobre el botón "Subir al


servidor", de forma automática se pasa el fichero al servidor.

2. Recepción de
fichero en el servidor. Al ejecutarse el script
uni4_eje6_sube.php, el servidor recibe este fichero en un directorio temporal,
especificado en la variable de entorno upload_tmp_dir. En nuestro caso, este
directorio es C:\xampp\tmp. Al fichero se le pone un nombre que se inicia por

- 233 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

php, seguido de unos números y de la extensión tmp. Por ejemplo,


Php1001.tmp. Además, de forma automática, se crea la variables nueva
$_FILES['fichero'], que nos informan de los siguientes datos:

 $_FILES['fichero']['name']: nombre original del fichero que se pasa.


 $_FILES['fichero']['tmp_name']: nombre del fichero temporal que se
sube al servidor.
 $_FILES['fichero']['size']: tamaño del fichero que se pasa.
 $_FILES['fichero'][type']: tipo del fichero que se pasa.

Pero el fichero temporal permanece sólo unos instantes en el directorio


temporal del servidor, por lo cual hay que copiarlo al directorio donde queremos
que se mantenga.

3. Copia del fichero desde el directorio temporal hasta el directorio destino. Al


llevar a cabo esta operación es el momento de hacer los controles que
creamos oportunos para que no se copie un fichero de cualquier tipo, ni se
sustituya otro que tuviera el mismo nombre, ni se sobrepase una determinado
tamaño, etcétera.

Para copiar el fichero, podemos usar las instrucciones:

$fichero_destino="$directorio".$_FILES['fichero']['name'];

move_uploaded_file($_FILES['fichero']['tmp_name'], $fichero_destino);

En cuanto a los controles anteriores a la copia, podemos hacerlos así:

 Para evitar que se copie un fichero de tamaño mayor de 50 Kb o que no


ha sido elegido en el formulario al enviar la variable $_FILES vacía,
podemos escribir:

if ($_FILES['fichero']['size']>51200 or $_FILES['fichero']['size']<1)
{
die ("<B>El fichero ocupa más de 51.200 bytes o no ha indicado
su nombre en el formulario. No puede copiarse.</B>");
}

 Para copiar ficheros de cualquier tipo, podemos escribir:

if ($subir_cualquiera=="SI")
{
$fichero_destino="$directorio".$_FILES['fichero']['name'];
move_uploaded_file($_FILES['fichero']['tmp_name'],
$fichero_destino);
}

4. Destrucción del fichero temporal. Aunque el servidor borra automáticamente


en pocos segundos el fichero temporal, es conveniente eliminarlo también
desde el propio programa para evitar que se vayan quedando en ese directorio
temporal ficheros que ya no se necesitan. Por ejemplo, el servidor puede

- 234 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

funcionar mal, apagarse, etcétera, sin haber llegado a eliminar el fichero


temporal. Se hace con la instrucción

unlink($_FILES['fichero']['tmp_name']);

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 6 (Subir fichero)


de la Unidad 4. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

En este Ejemplo 6 de esta Unidad puede verse comentado y completo el


código anterior. En esa sencilla aplicación se elige un fichero y se sube al
servidor poniendo algunos controles de validación.

- 235 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Otras operaciones con ficheros y directorios


Además de las operaciones mencionadas, con los ficheros y directorios pueden
llevarse a cabo otras operaciones, como las que explicamos a continuación.

Rellenar una ventana desplegable con los ficheros de un directorio

Resulta muy cómo seleccionar uno entre varios ficheros si en una etiqueta
SELECT de HTML pueden incluirse todos los ficheros del directorio o sólo
algunos, según su tipo. En el código siguiente puede verse cómo se hace:

$directorio = getcwd() ."/";


echo "<SELECT NAME=\"$directorio\">";
$puntero=opendir($directorio);
// Avanzamos el puntero hasta el primer
// fichero sobrepasando . y ..
$fichero=readdir($puntero);

while ($fichero)
{
$fichero=readdir($puntero);
if (ereg("$",$fichero))

/* La función ereg() permite buscar cadenas


coincidentes. Pertenece a las funciones
para expresiones regulares, como eregi() y
split(), entre otras. */

echo "<OPTION VALUE='$fichero'>$fichero</OPTION><P>";


}
echo "</SELECT>";

Puede verse cómo se lleva a cabo esta operación en el Ejemplo 7 de esta


Unidad. En el mismo aparecen los parámetros que deben ponerse en la función
ereg() para que sólo se muestren los ficheros de tipo php o txt.

Transformar un fichero HTML en otro de tipo texto

Al estudiar la función fgetss() ya vimos que esta función lee un fichero y, si es


de tipo HTML, elimina las etiquetas propias de este lenguaje. Veamos cómo se
lleva a cabo esta operación:

$origen_html=fopen("uni4_eje7_fichero.html","r");
$destino_txt=fopen("uni4_eje7_fichero.txt","w")
or die ("No se puede crear el fichero destino.");

while (!feof($origen_html))
{
$linea=fgetss($origen_html,256,"");
echo "$linea <P>";
fputs($destino_txt,trim($linea)."\n");
}

- 236 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

A veces, puede resultar útil esta rutina cuando se necesita disponer de un


fichero en cuyo contenido se hayan eliminado las etiquetas HTML y convertido
el fichero en otro nuevo de tipo texto.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 7 (Otras


funciones) de la Unidad 4. Estudia el código fuente y ejecútalo para
mostrar en el navegador su resultado.

En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas en este apartado.

Permisos y propietarios

Cuando se trabaja en una plataforma UNIX, cosa habitual en Internet, PHP


dispone de un conjunto de funciones que permiten gestionar los permisos y
propietarios de los ficheros y de los directorios. Como este curso ha sido
creado para Windows, recomendamos al alumno o alumna que use PHP con
Unix/Linux que estudie y aprenda a usar las funciones siguientes:

 chgrp(): permite cambiar el grupo al que pertenece un fichero.


 chmod(): permite cambiar los permisos de un fichero.
 chwon(): permite cambiar el propietario de un fichero.
 filegroup(): devuelve el identificador de un grupo.
 fileowner: devuelve el identificador del usuario de un fichero.
 fileperms(): devuelve los permisos de un fichero.

- 237 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Resumen

Hay que saber al final de esta unidad

 Establecer un directorio por defecto con chdir().

 Abrir un fichero con fopen() o con dir(), poniendo


controles con die() y con file_exists() por si el
fichero no existe o la operación con se puede
realizar.

 Usar el operador @ y aplicar correctamente los


diversos modos de abrir un fichero, tanto de
lectura como de escritura.

 Cerrar un fichero con fclose().

 Recorrer un fichero moviendo el puntero con


fread() y con rewind().

 Mover el puntero de un fichero con fseek().

 Localizar la posición del puntero con ftell().

 Conocer si el puntero ha llegado a la marca de


final de fichero con feof().

 Leer el contenido de un fichero con feread(),


fgets(), fgetc() y fgetss().

 Leer un fichero línea a línea con file() y saber


cuántas líneas tiene con count().

 Leer el contenido de un fichero completo con


readfile() y fpassthru().

 Escribir en un fichero con fputs() y fwrite()


sabiendo aplicar en cada caso los diferentes modos
de apertura.

 Copiar ficheros con copy() combinada con

- 238 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

file_exists().

 Borrar ficheros con unlink().

 Renombrar ficheros con rename().

 Conocer el tamaño de un fichero con filesize(), su


tipo con filetype() y sus atributos con is_dir(),
is_executable(), is_file(), is_link(),
is_writable() y is_readable().

 Conocer la información sobre un fichero que se


genera con la función stat() y se guarda en una
matriz.

 Abrir un directorio con la función opendir() y la


clase dir().

 Conocer y saber usar correctamente las propiedades


y métodos de la clase dir().

 Cerrar un directorio con closedir().

 Leer los ficheros o subdirectorios de un


directorio con readdir() o con la clase dir().

 Mover el puntero de lectura de un directorio con


rewinddir().

 Crear un directorio con mkdir().

 Borrar un directorio con rmdir().

 Subir ficheros al servidor, usarlos y validarlos.

 Rellenar una ventana desplegable (SELECT de HTML)


con los ficheros de un directorio.

 Transformar un fichero HTML en otro de tipo texto.

- 239 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

- 240 -
MÓDULO 2

Control de usuarios y gestión de


sesiones

Unidad 5

Índice de la unidad:

1. Cookies

2. Cabeceras

3. Control simple de usuarios

4. Gestión de sesiones

5. Control de conexiones

6. Resumen
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Introducción
En esta Unidad vamos a conocer qué son las cookies, para qué se usan y
sus limitaciones. Además, distinguiremos los elementos que integran las
cookies, las crearemos, modificaremos y las borraremos.

Aprenderemos qué son las sesiones de usuario, para qué se usan y cómo se
gestionan.

Finalmente, aplicaremos correctamente las funciones que permiten controlar


las conexiones y operaciones que realizan los usuarios que acceden al
servidor.

Las cookies
El sistema de trabajo basado en la comunicación entre cliente y servidor web a
través de Internet puede realizarse sin que sea necesario que el primero, que
hace una solicitud al segundo y recibe de él información, necesite identificarse.
Así lo hemos hecho hasta ahora en los ejercicios de las Unidades anteriores,
más por motivos didácticos que técnicos.

Pero lo más frecuente en las comunicaciones y transacciones reales entre


cliente y servidor web es que éste obtenga información del usuario e incluso
controle y permita su acceso, así como que tenga constancia de sus
operaciones y las autorice mediante los correspondientes permisos. Esto se
logra de dos formas que vamos a abordar en esta Unidad: mediante las
cookies, que entre otras pueden tener esta misión, y sobre todo mediante el
control de usuarios y la gestión de sesiones.

Concepto de cookie

Las cookies (“galletas”, en inglés) es un mecanismo que usan los servidores


web para guardar información en el ordenador del usuario y recuperarla cada
vez que usuario vista la página. Se basa en utilizar unos ficheros de texto muy
pequeños que contienen información del propio cliente. El servidor solicita al
usuario algunos datos, que se guardan en el disco duro del propio cliente
(navegador) y pueden ser recuperados después por el servidor en sucesivas
conexiones. Así, el servidor puede comprobar de alguna forma si ese usuario
ya ha solicitado una información determinada o contestado a alguno de los
cuestionarios propuestos, para poder seguir sus conexiones, orientarle sobre lo
solicitado, almacenar datos de conexión, carrito de la compra, preferencias,
etcétera.

La información se guarda en el ordenador del usuario en un fichero en formato


texto y está formada por parejas: nombre de la cookie y su valor.

- 243 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Las cookies son usadas con bastante frecuencia por las web que necesitan
llevar un control de los usuarios que las visitan y las consultas que hacen,
sobre todo las que se dedican al comercio electrónico, que almacenan en ellas
los códigos de los productos que consultan, para poder recuperarlos
directamente de este fichero si el cliente vuelve a visitarlas.

No es lugar éste para discutir la moralidad de este procedimiento que, según


algunos, atenta contra la privacidad del usuario. En todo caso, conviene saber
que la información que puede contener una cookie es muy elemental y básica,
y no puede incluir información reservada o crítica, como claves personales,
números de cuentas corrientes o de tarjetas de crédito, etcétera. De todas
formas, son los administradores de los servidores y sus dueños quienes
deciden qué información solicitan y, por tanto, los responsables de su recogida
y usos. También el usuario puede completarla o no, según sus conveniencias.

La Comisión Europea publicó en Diciembre de 2009 la Directiva 2009/136/CE


que legisla la utilización de las cookies por los sitios web. Por esto, cuando
accedes por primera vez a una web que usa cookies, ésta debe mostrar la
información correspondiente sobre su política de cookies. Por ejemplo,
podemos ver este tipo de mensajes:

Casi todos los navegadores, como Firefox, Chrome o Internet Explorer, sólo
admiten un número máximo de cookies en total (unas 300 dependiendo del tipo
de navegador y sin cumple la directiva de estándar RFC 2109). Además, el
tamaño máximo por cookie es de 4 Kb (4.096 bytes), por lo cual no hay que
tener miedo de que saturen la capacidad del disco duro.

Información de las cookies

La información de una cookie está definida en el protocolo HTTP e integrada


por los siguientes datos, que constituyen los parámetros de la función que la
crea:

1. Nombre de la cookie.

2. Valor, que es el contenido de la cookie.

3. Fecha de caducidad: periodo de vigencia durante el cual puede ser


recuperada por el servidor.

4. Dominio dentro del cual es válida la cookie. Si no se especifica, sólo es


válida para el dominio del servidor que la generó. El navegador devuelve la
cookie a cualquier equipo que tenga el dominio especificado.

5. Ruta: por defecto es “/”, es decir, el directorio raíz de las páginas a las que
se devuelve la cookie.

- 244 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

6. Seguro: por defecto está desactivado (Disabled), pero puede especificarse


este parámetro para establecer un canal seguro del protocolo HTTPS si se
necesita por tratarse de una información confidencial.

Al estudiar las funciones de creación y manejo de las cookies, se verá cómo


incluir estos parámetros dentro de la función correspondiente.

El lenguaje PHP dispone de funciones para crear, leer y borrar cookies. De


ellas vamos a tratar en los apartados siguientes. Si lo quiere, el alumno o
alumna, a partir de ahora, puede incluir este procedimiento en las aplicaciones
que escriba. En el manual de PHP puedes encontrar un capítulo dedicado a las
cookies.

Crear, leer y borrar cookies

La función setcookie() crea y envía al cliente una cookie estableciendo los


elementos que la integran. Su sintaxis es la siguiente:

setcookie ("nombre de la cookie", $valor, fecha de caducidad,


ruta, dominio, seguro);

De estos seis parámetros sólo es imprescindible el primero, nombre de la


cookie. Si no se pone el segundo, se crea la cookie, pero a la vez se borra en
el ordenador del cliente. Los tres parámetros siguientes, si no se ponen, toman
el valor que esté fijado en la configuración del servidor. El último, si no se pone,
queda deshabilitado. Si se quiere habilitar, hay que poner el valor 1. Para saltar
un parámetro cuando hay que poner otro posterior, deben ponerse las comas y
entre ellas una cadena vacía (,"",) en $valor, ruta y dominio. En el caso de
fecha de caducidad y seguro hay que poner un número entero (número de
segundos en la fecha) o 0 (en seguro) si no se quiere fijar expresamente.

La función setcookie() crea y envía una cookie al cliente juntamente con la


cabecera de la página. Por eso, es absolutamente imprescindible escribir esta
función antes que las etiquetas <HTML> o <HEAD>, incluso sin poner delante
espacios ni líneas en blanco, para que sea la primera que se ejecute al
procesarse el script PHP. De lo contrario, se produce un error indicando que no
puede añadirse la información de la cabecera.

Hay que tener en cuenta que, cuando se crea una cookie, es enviada al
cliente, por lo cual no se puede ver hasta que se carga de nuevo la
página. Si se han incluido en el mismo script las dos operaciones (crear cookie
y ver su contenido), debe ejecutarse la página dos veces para que se muestre
el valor que tenga en la segunda carga.

IMPORTANTE: al utilizar la función setcookie() hay que tener la precaución


de escribir el contenido de la página después de crear las cookies con esta
función, ya que, si no, PHP mostrará un aviso y no se creará la cookie. Esto
ocurre porque las cookies se crean mediante cabeceras de respuesta HTTP y
estas cabeceras se envían antes del contenido de la página, es decir, cuando
PHP encuentra una instrucción que escribe texto, cierra automáticamente la

- 245 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

cabecera y la envía al navegador del visitante; si, a continuación, PHP


encuentra la función setcookie(), aparecerá un aviso porque ya se han
enviado las cabeceras y, por lo tanto, no puede crear la cookie. En el siguiente
apartado de esta Unidad estudiaremos cómo gestionar cabeceras HTML con
PHP.

En el ejemplo siguiente vemos un código incorrecto, ya que usa la función


setcookie() después de haber escrito texto:

<?php
// La sentencia siguiente es incorrecta
print "<p>Hola mundo</p>\n";
setcookie("frase", "Adios");

?>

PHP mostrará el siguiente mensaje de avisto:

<p>Hola mundo</p>
Warning: Cannot modify header information – headers already sent by
(output started at index.php on line 2) in index.php on line 3

Hay que tener en cuenta que unas líneas en blanco al principio del fichero PHP
(antes de la etiqueta <?PHP) también se considera contenido de la página web
y aparecerá el error anteriormente mostrado.

Nota: en algunos servidores PHP, este código incorrecto puede no generar un


mensaje de aviso y la cookie puede crearse, dependiendo de la configuración
de la directiva output_buffering. Esta directiva se estudia en el curso
Avanzado de PHP de Mentor, aquí sólo indicamos que se trata de un buffer
intermedio para reducir el tráfico de salida del servidor que permite crear
cookies en cualquier parte del código PHP.

Veamos varios ejemplos donde se crean cookies con diferentes parámetros:

$usuario="Jorge";

setcookie("Nombre", $usuario);

crea una cookie denominada nombre que contiene el valor “Jorge”. También
podíamos haber escrito más directamente

setcookie("Nombre","Jorge");

Podemos fijar su caducidad de esta forma:

$pieza="Tornillo";

setcookie("Hierro", $pieza, time()+300);

- 246 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

En el tercer parámetro indicamos que dure 5 minutos (300 segundos) a partir


del momento en que se crea. Si queremos que dure hasta las 12:30:00 del día
31 de julio de 2014, podemos escribir también:

setcookie("Hierro", $pieza, mktime(12,30,0,7,31,2014);

Al crearse la cookie anterior se crea a la vez una variable, que tiene como
nombre el nombre de la cookie ($_COOKIE["Nombre"]) y como contenido su
valor ("Jorge"). Esta variable permanece con un ámbito global hasta que
caduque la cookie.

Las variables que contienen cookies son almacenadas por PHP en un array
denominado $_COOKIE["nombre de la variable"]. De esta forma podemos
leer y mostrar cada cookie si conocemos su nombre:

print ("La cookie nombre tiene el valor ".$_COOKIE["Nombre"].".");

o recorrer con un bucle toda la matriz de cookies y leer su índice y su valor:

while( list($nombre, $contenido) = each($_COOKIE) ) {


print ("La cookie <B>$nombre</B> tiene el valor
<B>".$contenido."</B><P>");
}

La forma más frecuente de usar las cookies en Internet es haciendo que el


usuario introduzca los datos mediante un formulario la primera vez que entra en
la página. El código puede ser similar al siguiente:

<?
if ( (isset($_POST["accion"])) && ($_POST["accion"]=="crearcookie") )
{
setcookie("usuario",$_POST["tu_nombre"],time()+60);
echo "Hola, ".$_POST["tu_nombre"].". Bienvenido a nuestra
página web. ¡Actualiza la página para ver
los datos de la cookie almacenada!<P>";
if (isset($_COOKIE["usuario"]) and $_COOKIE["usuario"]!="")
print ("La cookie <B>usuario</B> tiene el valor
<B>".$_COOKIE["usuario"]."</B><P>");
}
else

echo "<FORM ACTION=\"index.php\" METHOD=POST>


<INPUT TYPE=\"hidden\" NAME=\"accion\"
VALUE=\"crearcookie\">
Nombre de usuario:
<INPUT TYPE=\"text\" NAME=\"tu_nombre\">
<INPUT TYPE=\"submit\" VALUE=\"Enviar\">
</FORM>";

?>

Cuando se ejecuta este código por primera vez, como $_POST["accion"] no es


igual a “crearcookie”, se ejecutan las líneas del formulario HTML, dentro de la

- 247 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

cláusula else. En estas líneas se establece que al pulsar el botón “Enviar” se


vuelva a ejecutar el mismo script (ACTION="index.php"), se asigna a la variable
$_POST["accion"] el contenido “crearcookie” (INPUT TYPE="hidden"
NAME="accion" VALUE="crearcookie") y se pregunta el nombre del usuario en
una ventana (Nombre de usuario: <INPUT TYPE="text" NAME="tu_nombre").
Cuando se pulsa “Enviar” en la variable $_POST["tu_nombre"] pasa el contenido
y se crea la cookie usuario con el contenido que haya en $_POST["tu_nombre"]
y se le asigna una caducidad de un minuto (setcookie
("usuario",$_POST["tu_nombre"], time()+60);). Para ver el contenido
guardado en la cookie es necesario ejecutar el script por segunda vez
actualizando la página.

Puedes ver cómo funciona un código más completo en el Ejemplo 1.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 1 (Cookie) de la


Unidad 5. Estudia el código fuente y ejecútalo para mostrar en el navegador
su resultado.

Si lo ejecutas, verás que aparece la siguiente página:

Para eliminar una cookie basta escribir la función setcookie() incluyendo


como único argumento el nombre de la cookie que se quiere eliminar. Por
ejemplo, la instrucción setcookie("Nombre"); borra la cookie del mismo
nombre.

ATENCIÓN: para borrar la cookie en algunos navegadores es necesario indicar


un tiempo anterior al actual con la instrucción: setcookie("Nombre", "",
time()-1000);

En el Ejemplo 1 de esta Unidad hacemos desaparecer la cookie creada


pulsando en el botón apropiado y utilizando esta función.

Para modificar una cookie basta escribir de nuevo la función setcookie()


incluyendo los nuevos argumentos y usando el nombre de la cookie que se
quiere editar.

Como hemos visto, a las cookies se les puede poner limitaciones de tiempo
(parámetro expire de caducidad), de camino dentro del cual pueden ser vistas

- 248 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

(parámetro path de ruta), de ámbito dentro del servidor (parámetro domain de


dominio) y de protección de la privacidad (parámetro secure de seguridad).

Cookie de tipo matriz

También podemos asignar varios valores a una misma cookie. Esto es útil y
necesario para no alcanzar el límite de cookies permitido por el navegador del
usuario. Para hacerlo, usamos una matriz que tenga tantos elementos como
valores queramos que contenga la misma cookie. Podemos crearla así:

setcookie("Libro[0]","El médico",time()+300);

setcookie("Libro[1]","Noah Gordon",time()+300);

setcookie("Libro[2]","1992",time()+300);

Después, podemos leer y mostrar su contenido con un bucle for accediendo


con el índice a cada elemento de su nombre, como en los casos anteriores.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 2 (Cookie


matriz) de la Unidad 5. Estudia el código fuente y ejecútalo para mostrar en
el navegador su resultado.

Si ejecutas este programa puedes ver una página que, mediante una cookie de
tipo matriz, muestra las últimas visitas que ha realizado el visitante a la página
en orden cronológico y permite eliminar las cookies almacenadas en el
navegador:

- 249 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Cabeceras de los documentos HTTP, HTML y URL


Hemos comentado en el apartado anterior que es absolutamente
imprescindible escribir la función setcookie() antes que las etiquetas <HTML> o
<HEAD>, incluso sin poner delante espacios ni líneas en blanco, para que sea la
primera que se ejecute al procesarse el script PHP antes de que el servidor
envíe alguna salida al cliente. Aprovechamos este momento para hablar de las
cabeceras de los documentos que generan páginas web.

Las cabeceras contienen diversos datos, unos para ofrecer información y otros
para que la página se muestre con determinadas características. Por ejemplo,
pueden incluir textos que deben aparecer, claves para que los buscadores
puedan encontrarlas, información sobre los créditos de la aplicación, control de
la memoria caché de navegador, especificación del tiempo de refresco de la
página, etcétera. En la Cabecera reside información acerca del documento y,
generalmente, el usuario no aprecia su contenido cuando navega en Internet.
Es importante recordar que estos elementos son opcionales, es decir, no son
obligatorios o necesarios para la realización de una página web.

En lenguaje HTML una cabecera define una propiedad de la página y los


atributos de esa propiedad. En este lenguaje cada cabecera va precedida de la
palabra META. Por ejemplo,

<META NAME="Autor" CONTENT="J.J. Caballero">.

En la dirección http://www.w3.org/Protocols/rfc2068/rfc2068 y en la dirección


http://vancouver-webpages.com/META/ hay información sobre las etiquetas
que se usan en HTML dentro de las cabeceras y para qué sirven.

PHP dispone de la función header() para enviar cabeceras HTTP desde este
lenguaje. Su sintaxis es sencilla:

header(cadena con el nombre de la cabecera y su valor);

Al igual que pasa con setcookie(), para que funcione correctamente, hay
que poner esta instrucción al principio del script, antes de que se envíe
ninguna salida al navegador del cliente.

Por ejemplo, la instrucción

header("Expires: Mon, 20 Jul 2014 22:00:00 GTM");

establece que el documento HTML generado con esta cabecera y presente en


la caché de un servidor proxy o del mismo navegador del cliente expira el día
20 de julio de 2014 a las 10 de la noche.

Conviene observar que el nombre de la etiqueta (Expires) es propio del


lenguaje HTML y, por tanto, para saber cuáles son y lo que hace cada una, se

- 250 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

puede recurrir a la segunda dirección de Internet que hemos indicado más


arriba.

La instrucción

header("Content-Type: text/html");

establece el tipo de documento que será válido en el navegador del usuario, en


este caso los documentos de tipo texto o planos.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 3 (Cabeceras) de


la Unidad 5. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

Si ejecutas este programa verás que la página no se guarde en la caché del


navegador y que se recargue automáticamente cada 10 segundos:

- 251 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Control simple de usuarios


El control de usuarios de una aplicación en Internet es uno de los
procedimientos más frecuentes y comunes, de forma que sólo puedan acceder
a determinadas páginas aquellas personas que sean reconocidas y estén
autorizadas en sus diferentes perfiles. De este asunto vamos a tratar
precisamente en el presente apartado.

Las distintas acciones que se llevan a cabo para verificar la validez de un


usuario se agrupan en tres operaciones lógicas: Autenticación, Autorización y
Control de Acceso:

 Autenticación: proceso por el cual se verifica la identidad de una


persona.
 Autorización: proceso que verifica que un usuario con una identidad
conocida, tiene acceso al recurso solicitado. Para llevar a cabo esta
acción, se suelen utilizar listas de permisos en las cuales se enumeran
cada una de las acciones que puede realizar un usuario, o las que no
puede hacer. Normalmente, para simplificar la gestión de estos ficheros,
los usuarios se suelen unir en grupos proporcionando los permisos al
grupo.
 Control de acceso: proceso que verifica que la máquina desde la que
se ha hecho la petición, tiene acceso al recurso. Los controles de acceso
se utilizan para limitar y controlar los equipos tienen acceso a un recurso
independientemente del usuario que accede, ya que estos controles se
llevan a cabo antes de que se realice el proceso de autenticación. Por
ejemplo, un servidor web interno de una empresa debe ser sólo
accesible desde sus oficinas (Intranet) y no desde Internet.

Como sabemos, este control de Autenticación suele hacerse preguntando un


nombre o identificador de usuario (id o login) y una clave o contraseña
(password). Generalmente, esta validación de los usuarios que acceden a un
servidor web suele ser llevada a cabo por el propio servidor. Pero también es
posible hacerlo enviando en la cabecera una solicitud de validación para entrar
en una aplicación concreta.

Para que una aplicación pueda obtener un nombre de usuario y una


contraseña, es preciso dar los siguientes pasos:

1. El servidor debe remitir al cliente una cabecera de validación.

2. El navegador del cliente pregunta al usuario, en un cuadro de diálogo, el


nombre de usuario y su contraseña.

3. El navegador proporciona al servidor estos datos y solicita cargar la página,


cosa que sucede si hay coincidencia de ambos datos con los que contiene el
servidor.

- 252 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Expliquemos paso a paso este proceso suponiendo que no es el servidor quien


controla externamente este proceso de validación de usuarios, sino que se
hace a través de las cabeceras oportunas utilizando PHP.

 Para remitir la cabecera de validación, hay que utilizar las dos


instrucciones siguientes, que envían dos cabeceras:

header('WWW-Authenticate: Basic realm="Curso de PHP 5"');

header('HTTP/1.0 401 Unauthorized');

Si se necesita conocer el valor de los argumentos HTTP/1.0 (HyperText


Transfer Protocol), puede buscarse información en la dirección de Internet
http://www.w3.org/Protocols/HTTP/1.0/spec.html.

 Al enviar estas cabeceras de validación, PHP presenta un cuadro de


diálogo solicitando el nombre y la contraseña. Este cuadro de diálogo
puede ser diferente en cada navegador.
 Una vez leídos los valores, estos dos datos se asignan a las variables de
entorno $_SERVER['PHP_AUTH_USER'] (nombre de usuario) y
$_SERVER['PHP_AUTH_PW'] (contraseña).

Como puede ocurrir que ninguna de las dos variables de entorno citadas
($_SERVER['PHP_AUTH_USER'] y $_SERVER['PHP_AUTH_PW']) esté definida porque
el usuario todavía no se ha validado, conviene utilizar el control condicional if
(!isset( $_SERVER['PHP_AUTH_USER'])) para prevenir posibles errores.

Mediante Eclipse PDT puedes abrir el proyecto Ejemplo 4 (Control


usuarios) de la Unidad 5. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

En Ejemplo 4 de esta Unidad puede verse el código completo de una


aplicación que utiliza este procedimiento de validación:

- 253 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Una vez que tenemos el nombre de usuario (curso) y su contraseña (123),


podemos comprobar de múltiples formas si son correctos y darle acceso a la
página que pretende ver:

El procedimiento más elemental es comparar la información que nos


proporciona el usuario en ambos apartados del cuadro de diálogo con los datos
que tengan asignados dos variables y comprobar su coincidencia, en cuyo caso
se le permite el acceso. De no ser así, se muestra un mensaje indicando que
no está autorizado. En el Ejemplo 4 de esta Unidad lo hacemos así.

- 254 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Un procedimiento más completo y frecuente es acceder a una base de datos o


a un fichero de texto donde estén archivados los nombres y contraseñas de los
usuarios autorizados y comprobar si los que ha proporcionado el cliente están
dentro de ese fichero o de la base.

También es posible hacer esta validación de usuarios intentando una conexión


a una base de datos con la información proporcionada por el usuario. Como
todavía no hemos abordado las bases de datos, pondremos algún ejemplo de
estos dos últimos procedimientos en ese momento.

Otro tema relacionado con la validación de usuarios es la revalidación de un


usuario en un momento dado. Si un usuario deja abierto su navegador,
cualquier otra persona puede acceder a su información. Es más, algunos
navegadores ofrecen la posibilidad de guardar los datos de acceso en la
memoria caché, con lo cual es fácil acceder utilizando esa información sin
necesidad de ser el usuario autorizado ni conocer su nombre y contraseña. Por
esto es mejor utilizar las Sesiones de usuario que se verán en el siguiente
apartado.

Control de usuarios delegada en Apache

El servidor web Apache dispone de varios sistemas de Autenticación que se


gestionan mediante diferentes módulos, dependiendo de la forma de
implementación. Si se gestiona mediante ficheros con listas de usuarios y
contraseñas (cifradas) se deberá utilizar el módulo mod_auth. Si, se lleva a
cabo mediante base de datos hay que utilizar los módulos mod_auth_dbm.

En apache la Autorización a recursos es gestionada o bien mediante la


directiva <directory> en el fichero principal de configuración, o bien mediante
la configuración de la carpeta a través de ficheros .htaccess.

Autenticación y autorización de usuarios en Apache mediante mod_auth

Para configurar el servidor Apache para que sea capaz de autenticar a los
usuarios y verificar la autorización del mismo al recurso solicitado, es necesario
realizar las siguientes operaciones:

1. Crear un fichero con usuarios.


2. Crear un fichero con grupos de usuario (si fuera necesario).
3. Definir las directivas en el fichero de configuración del servidor o
mediante un fichero .htaccess.

Para dar de alta usuario en Apache ejecutamos en el directorio “bin” del


servidor Apache el siguiente comando:

C:\xampp\apache\bin>htpasswd -c C:\xampp\apache\conf\usuarios
admin
New password: *****
Re-type new password: *****
Adding password for user admin

- 255 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

El parámetro -c se indica que se debe crear un fichero nuevo, por lo que sólo
se deberá poner la primera vez que se crea el fichero. En este caso hemos
almacenado el nuevo usuario “admin” en el directorio “conf” del servidor Web.
Para acceder al nuevo fichero de usuarios creado, abrimos el Panel de control
de XAMPP y pulsamos en la opción mostrada en la siguiente captura de
pantalla:

En este directorio podemos ver el fichero “usuarios” recién creado:

- 256 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

En este fichero de usuarios de Apache, en cada línea se especifica un usuario,


escribiendo el nombre de usuario separado de dos puntos, seguido de la
contraseña cifrada con MD5. En el caso del usuario admin/admin el contenido
del fichero es éste:

admin:$apr1$IvxgJjXC$TLlxWN/GZhyGJ7Q2odIcd/

Los módulos de Apache que intervienen en la autenticación y autorización


básica de usuarios son core y mod_auth.

Las directivas de mod_auth necesarias para configurar la autenticación y


autorización son las siguientes:

 AuthUserFile: especifica la ruta donde se encuentra el fichero de


usuarios.
 AuthGroupFile: indica la ruta donde se almacena el fichero de grupos.

Las directivas del módulo core que complementan la configuración son:

 AuthType: selecciona el tipo de autenticación de usuarios que se utilizará


que puede variar en distintos directorios. Puede contener los valores
posibles son Basic (transferencia de claves en texto claro) y Digest
(transferencia de claves cifrada).
 AuthName: especifica un nombre del dominio para el cual se solicita el
acceso, este nombre figurará en la pantalla de navegador donde se pide

- 257 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

la clave y, a su vez, servirá para que el cliente identifique la contraseña


que debe utilizar al enviar una petición a un área determinada.
 Require: indica los usuarios que pueden acceder a un área determinada
mediante sus nombres o grupos.

En el Ejemplo 4 de esta Unidad en el subdirectorio “usuario_apache” podemos


encontrar el fichero .htaccess que contiene este texto:

AuthType Basic
AuthName "Curso PHP 5"
AuthBasicProvider file
AuthUserFile C:\xampp\apache\conf\usuarios
Require valid-user

Este archivo de autenticación indica: el tipo de autenticación debe ser Básica


(AuthType Basic), el nombre de autenticación es “Curso PHP 5” (etiqueta
AuthName), la autenticación se realiza mediante un fichero de texto
(AuthBasicProvider file), dónde se encuentra este fichero de usuarios
(AuthUserFile C:\xampp\apache\conf\usuarios) y se requiere un usuario
válido para acceder al directorio (Require valid-user).

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 4 (Control de


usuarios) de la Unidad 5. Estudia el código fuente y ejecútalo para mostrar
en el navegador el resultado de la gestión delegada de Apache en PHP.

En este caso que usamos la validación externa delegada que dispone el


servidor Apache usamos la variable $_SERVER['REMOTE_USER'] para conocer la
identidad del usuario que se ha validado externamente.

Si ejecutas el programa y haces clic en el enlace “Pulsa aquí para la


validación usuario Apache” y escribes el usuario admin/admin en la ventana
emergente que aparece verás que se accede correctamente al contenido del
directorio usuario_apache:

- 258 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Gestión de sesiones
La gestión de las sesiones de usuario facilita considerablemente el trabajo del
desarrollador de una aplicación web para controlar la navegación del usuario
por las páginas del servidor.

Mediante las sesiones se puede saber qué operaciones realiza el cliente a lo


largo de su navegación, dato que deben conocer las aplicaciones que tengan
que controlarlo, como son las de comercio electrónico, las de transacciones
bancarias o las que tienen una cesta de la compra, en las que suelen
proporcionarse y transmitirse datos confidenciales que exigen mejor gestión de
las sesiones.

Una sesión se crea en el momento en que un usuario entra en un website


pudiéndose identificar o acceder anónimamente. Al entrar, se genera un
identificador (id), que puede seguirse mientras esté conectado para saber qué
informaciones obtiene o qué operaciones realiza el citado usuario. Los datos de
la sesión asociados a este identificador se guardan en el servidor dentro de un
fichero en el directorio especificado en la sección [Session] del fichero de
configuración php.ini. Concretamente, al instalar el Curso hemos fijado el
camino siguiente para guardar este identificador, como puede verse en el
fichero citado antes:

session.save_path = "C:\xampp\tmp"

Hay dos maneras de propagar el id del usuario entre las diferentes páginas :

 Mediante Cookies.
 A través de Parámetros URL.

Debido a que el método ideal consiste en utilizar cookies, vamos a centrarnos


en éstas.

Este identificador tiene un tiempo de vida y, por tanto, la sesión que lo ha


creado también caduca. Este tiempo puede fijarse en el fichero php.ini dentro
de la variable session.cookie_lifetime, que está establecido por defecto a 0
para que caduque cuando se cierre el navegador. Si se establece otro valor, la
sesión caducará al pasar esos segundos y no es necesario cerrar el
navegador.

La diferencia con respecto a las cookies consiste en que, en el caso de las


cookies, la información se guarda íntegramente en el ordenador del usuario y
se envía en cada petición al servidor web, mientras que en las sesiones, la
información se guarda en el servidor. En el manual de PHP en Internet se
ofrece un capítulo dedicado a las sesiones.

La gestión de una sesión se puede se divide en tres procesos:

 Creación o inicio de la sesión

- 259 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Si una página PHP crea una sesión utilizando la función correspondiente


que veremos más adelante, el servidor asocia el navegador del usuario
con un identificador de usuario único. Este identificador se guarda en el
navegador del usuario mediante una cookie o, si no se permite la
creación de cookies, añadiendo el identificador en la dirección de la
página como un parámetro de tipo GET.

 Utilización de la sesión

Una vez está establecida la sesión, las páginas solicitadas por el mismo
navegador pueden guardar y recuperar información del servidor usando
el identificador de usuario. Esta información se guarda hasta que el
usuario o el servidor destruyen la sesión.

 Destrucción o cierre de la sesión

Tanto el usuario como el servidor web pueden cerrar la sesión. El


usuario puede destruir la sesión cerrando el navegador. El servidor
puede destruir la sesión cuando alguna página utilice la función
correspondiente que veremos más adelante o haya pasado cierto tiempo
de inactividad por parte del usuario, es decir, la sesión temporice.

Funciones para manejar las sesiones desde PHP

PHP incorpora funciones para gestionar las sesiones de usuarios. El nombre


de todas se inicia con el prefijo session seguido de _ y del nombre de la función
que realizan.

Abrir una sesión y conocer los datos de la misma

La función session_start() abre una nueva sesión de trabajo o prolonga la


que ya está abierta conservando su identificador. Su sintaxis es sencilla:

session_start();

IMPORTANTE: de igual forma que ocurre con las cookies, hay que tener la
precaución de utilizar la función session_start() antes de empezar a escribir
el contenido de la página, ya que si no PHP mostrará un mensaje de aviso y no
se creará la sesión. Como hemos comentado, el identificador de la sesión se
utiliza en las cabeceras de respuesta HTTP (como Cookie o como parámetro
GET) y las cabeceras se envían antes del texto de la página.

Todas las páginas que quieran gestionar sesiones de usuario deben incorporar
esta función o bien se puede establecer en el fichero php.ini dentro de la
variable session.autostart=1 para no tener que incluir esta sentencia en los
scripts php.

Una vez ejecutada esta función, se crea una cookie en el ordenador del usuario
o se lee la almacenada. Además, se guarda la información de la sesión en un

- 260 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

fichero en el directorio del servidor especificado en session.save_path del


fichero php.ini.

Diversas funciones nos permiten acceder a los datos de la sesión abierta.


Veamos cuáles son.

La función session_name() devuelve y/o establece el nombre de la sesión


abierta en ese momento. Se utiliza como nombre de la cookie. Por defecto es
PHPSESSID, pero podemos cambiarlo poniendo como argumento de esta función
otro nombre diferente.

Por ejemplo, la instrucción

print(session_name());

devuelve el valor de PHPSESSID.

y las instrucciones

session_name("Mi_sesión");

print(session_name());

devuelve Mi_sesión.

La función session_save_path() devuelve y/o establece el camino donde se


guardan el fichero con los datos de un identificador de sesión.

Por ejemplo, las instrucciones

session_save_path("C:/XAMPP/htdocs/curso/tmp/");

print(session_save_path());

devuelve C:/XAMPP/htdocs/curso/tmp/ y, además, desde este momento, la


sesión abierta guarda el identificador y los datos de la sesión en un fichero en
este directorio.

La función session_id() devuelve y/o establece el nombre del identificador de


la sesión en curso. Hay que tener en cuenta que esta identificación es
absolutamente imprescindible para el manejo y control de las sesiones de un
usuario, pues identifica el nombre de la cookie que se guarda en el ordenador
del usuario.

Por ejemplo, la instrucción

print(session_id());

devuelve el valor de PHPSESSID.

- 261 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

y las instrucciones

session_id("La sesión del curso");

print(session_id());

devuelve La sesión del curso.

Registrar la información de una sesión

Todos los datos devueltos por las funciones anteriores sólo permiten crear
sesiones, destruirlas e identificarlas. Pero lo verdaderamente importante es
poder asociar información sobre las operaciones y desplazamientos de un
cliente por una aplicación web. En este apartado vamos a estudiar las
funciones que permiten guardar esta información y acceder a ella
posteriormente.

A través de un ejemplo vamos a explicar cómo se guardan los datos de una


sesión.

<?php

session_start();
$_SESSION["usuario"]="Ana";
$_SESSION["hora"]=time();
$_SESSION["pagina"]="$_SERVER["PHP_SELF"];
if (empty($_SESSION["contador"])) {$_SESSION["contador"]=0;}
$_SESSION["contador"]++;

echo "Nombre de la sesión: ".$_SESSION['nombre'].


"<P>Nombre del usuario : ".$_SESSION['usuario'].
"<P>Hora última entrada: ".strftime("%H:%M:%S
del %d/%m/%Y",$_SESSION['hora']);

?>

En primer lugar, ponemos la orden session_start(); para crear una sesión. A


continuación, usamos definimos y modificamos las variables que deseamos
almacenar con $_SESSION. Finalmente modificamos el contenido de las
variables generadas y mostramos la información guardada.

PHP utiliza la matriz asociativa $_SESSION para almacenar distintos variables de


la sesión. Esta matriz es accesible desde páginas diferentes, siempre y
cuando, esas páginas tengan asociada el mismo nombre de sesión.

Los valores de $_SESSION se borran como en cualquier otra matriz mediante la


función unset().

Una puntualización importante que distingue a las sesiones de las cookies es


que:

- 262 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

 en el caso de las cookies, cuando una página pide al navegador que


cree una cookie, el valor de la cookie no está disponible en la matriz
$_COOKIE en esa página es la primera ejecución del código PHP y lo
estará en recargas de páginas posteriores por parte del navegador.
 en el caso de las sesiones, cuando una página crea un valor en
$_SESSION, ese valor está disponible en esa página desde la primera
ejecución de ésta por parte del servidor web.

Es decir, que el siguiente programa:

<?php

session_start();
$_SESSION["nombre"] = "Pedro Pablo";
if (isset($_SESSION["nombre"])) {
print "<p>Su nombre es $_SESSION[nombre].</p>\n";
} else {
print "<p>Nombre desconocido.</p>\n";
}

unset($_SESSION["nombre"]);

if (isset($_SESSION["nombre"])) {
print "<p>Su nombre es $_SESSION[nombre].</p>\n";
} else {
print "<p>Nombre desconocido.</p>\n";
}

?>

siempre mostrará el mismo resultado:

<p>Su nombre es Pedro Pablo.</p>

<p>Nombre desconocido.</p>

La función session_unregister() se usa para desligar una o más variables del


registro de la sesión. Es decir, aquí se realiza la operación contraria: si una
variable ha sido registrada como global con la función session_register(), con
session_unregister() podemos eliminarla para que no forme parte de los
parámetros iniciales.

En el ejemplo anterior, si escribimos session_unregister('usuario'); la


variable $_SESSION["usuario"] queda eliminada y, por tanto, ya no será posible
mostrar su información.

La función session_is_registered() nos permite saber si una variable está


definida en el registro de la sesión o no. Devuelve True si lo está y False si no
lo está. Siempre que trabajemos con variables del registro de una sesión,
conviene usar esta función evitando así posibles errores si una de ellas no está
registrada,

- 263 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

La función session_encode() devuelve una cadena que contiene los valores


codificados de una sesión. Dentro de la cadena separa cada valor con un signo
¡ al principio y un signo | al final.

La función session_decode() recupera los datos de una sesión guardados en


una cadena que se le pasa como argumento y los asigna a las variables de la
sesión en curso. Así pues, sirve para restaurar los valores de las variables
previamente guardadas en una cadena con la función session_encode().

Destruir una sesión

La función session_destroy() borra toda la información que se haya recogido y


asociado a la sesión activa. Su sintaxis es sencilla:

session_destroy();

También produce los mismos efectos la sintaxis que incluye como argumento el
identificador de la sesión session_destroy($session_id); e incluso
session_destroy("La sesión del curso");

Debemos tener en cuenta que esta función no destruye la sesión ni el fichero


donde se ha guardado la cookie con su identificador, sino sólo la información
asociada a la misma que se va generando a medida que un usuario va
moviéndose y realizando operaciones dentro de una aplicación web.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 5 (Sesiones) de


la Unidad 5. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas. Es muy importante que lo estudies en
detenimiento para completar el aprendizaje de este apartado.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 6 (Carrito de la


compra) de la Unidad 5. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

Este ejemplo muestra la forma de implementar un carrito de la compra


utilizando sesiones. Si ejecutas en Eclipse PDT el proyecto verás que aparece
la siguiente página:

- 264 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Es básico que analices el código fuente de este Ejemplo ya que en él se usan


variables de sesión de tipo matriz.

- 265 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Control de conexiones
Mientras un usuario está conectado al servidor nos puede interesar conocer las
acciones que realiza e incluso manejar sus decisiones, como la orden de
cancelar la carga de la página. PHP dispone de funciones para conocer y
controlar, hasta cierto punto, las conexiones de los clientes al servidor. En este
apartado vamos a tratar brevemente de este asunto.

El lenguaje PHP distingue tres estados en la conexión:

 Normal: el usuario está conectado. Tiene el valor 0.

 Abortado: el usuario ha mandado detener la carga de la página. Tiene el


valor 1 que equivale a la constante CONNECTION_ABORTED.

 Caducado: se ha sobrepasado el tiempo establecido de conexión. Tiene


el valor 2 que equivale a la constante CONNECTION_TIMEOUT.

Cuando un script PHP se está ejecutando, se activa el estado Normal. Si el


cliente remoto se desconecta, se pasa al estado Abortado. Esto puede ocurrir
cuando el usuario pulsa en el botón Stop (Detener) del navegador o la conexión
a Internet tiene cortes. Si se alcanza el límite de tiempo fijado en PHP para
ejecutar un script (ver las funciones connection_timeout() y
set_time_limit()), se pasa al estado Caducado (TIMEOUT).

Puede ocurrir que sea necesario también hacer que termine la conexión de un
usuario, por ejemplo, cuando no se ha validado correctamente o su consulta
persistente no obtiene resultados.

Veamos a continuación las principales funciones de PHP que permiten llevar a


cabo las operaciones mencionadas.

El Manual de PHP explica este proceso en el Apartado Manejo de


conexiones. Es recomendable leer las explicaciones que se dan en esta parte
del Manual y en cada una de las funciones que permiten el control de las
conexiones.

Conocer si el cliente ha cortado una conexión

La función connection_aborted() permite saber si el usuario ha desconectado


una conexión en curso. Esta función devuelve True si lo ha hecho y False en el
caso contrario. Su sintaxis es sencilla:

connection_aborted();

Si el usuario de la página pulsa sobre el botón Detener (Stop) de su navegador,


la función connection_status() devuelve el valor 1 y se deja de interpretar la
página que se esté cargando. Por lo tanto, no debe esperarse que PHP mande
ninguna salida más a la pantalla del usuario. En este caso, la mayoría de los

- 266 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

servidores y navegadores tienen previsto enviar al cliente un mensaje estándar


para que sepa qué está pasando. Por ejemplo, cuando una página caduca,
puede aparecer:

Advertencia: La página ha caducado

La página solicitada se creó utilizando la información que envió en un formulario. Esta página
no está ya disponible. Como medida de precaución, Internet Explorer no volverá a enviarle la
información.

Para volver a enviar la información y ver esta página Web haga clic en el botón Actualizar.

La función connection_status() devuelve el estado actual de la conexión,


según lo explicado anteriormente: el valor 0 indica que el usuario sigue
conectado; el valor 1, que ha interrumpido la conexión voluntariamente; el valor
2, que el tiempo de conexión ha caducado; el valor 3, que la conexión ha sido
interrumpida por el usuario y que también ha caducado.

La función connection_timeout() devuelve el valor True si el tiempo de


conexión ha caducado y False si no lo ha hecho.

Un script también se puede terminar por un temporizador interno. El timeout por


defecto es de 30 segundos. Se puede cambiar usando la directiva
max_execution_time en el fichero php.ini o la correspondiente directiva
php_max_execution_time en la configuración del servidor de páginas Apache.

La función set_time_limit() nos permite también establecer el tiempo de


ejecución de un script. Cuando el temporizador acaba su cuenta, el script se
aborta como en el caso de la desconexión del cliente. Debe tenerse en cuenta
que este temporizador empieza a contar desde 1 prescindiendo de los
segundos que ya se hubieran consumido. Como argumento debemos pasarle
el número de segundos que debe durar. El valor cero indica que no hay límite
de tiempo.

La función ignore_user_abort() determina si la desconexión voluntaria del


usuario debe suspender la ejecución del script. Esta función, pues, deshabilita
la posibilidad que tiene el cliente de desconectarse pulsando Detener (Stop).
Aunque el usuario deje de ver la interpretación de la página, PHP acaba con el
código completo.

La función register_shutdown_function() permite registrar una función que


debe ejecutarse al cerrarse una conexión. Toma como argumento el nombre de
otra función, que se ejecutará al acabarse la ejecución de un script. La función
pasada como argumento sólo se ejecuta después de haberse producido todas
las salidas de la página, por lo cual no puede usarse para mostrar información
en el navegador o guardarla en un fichero normal. Por esto, recomendamos
utilizar la función de PHP error_log() que permite guardar la información en
fichero. Es recomendable leer las explicaciones que se dan sobre esta función
en el apartado "Tratamiento de Errores" de la teoría de la Unidad 8.

- 267 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

La función get_browser() obtiene la información de un navegador guardada en


el fichero browscap.ini. Toma como argumento el nombre del navegador. La
información se refiere a las capacidades que tiene el navegador del usuario.

Otras funciones de PHP que suelen usarse en las conexiones

La función exit() nos permite terminar un programa cuando nos interese. La


interpretación del código PHP se interrumpe cuando se encuentra esta orden.
Ya la hemos usado en diferentes script.

La función die() hace lo mismo que exit(), pero permite mostrar un mensaje
de texto entre comillas dentro de los paréntesis. La interpretación del código
PHP se interrumpe cuando se encuentra esta orden y se muestra la cadena de
texto que se pone como argumento. Ya la hemos usado también en diferentes
script.

La función sleep() retrasa la ejecución de un programa tantos segundos como


se indique en su argumento. Por ejemplo, la instrucción sleep(10); retrasa la
interpretación de la página 10 segundos. Conviene saber que la interpretación
del programa no se detiene cuando se encuentra esta instrucción, sino que se
detiene desde el principio, es decir, no se manda nada a la pantalla del usuario
aunque la función sleep() ocupe la última línea.

La función usleep() retrasa la ejecución de un programa tantos microsegundos


como se indique en su argumento. Por ejemplo, la instrucción usleep(1000);
retrasa la interpretación de la página 1.000 microsegundos.

Usando Eclipse PDT puedes abrir el proyecto Ejemplo 7 (Control de


conexiones) de la Unidad 5. Estudia el código fuente y ejecútalo para
mostrar en el navegador su resultado.

En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas.

Si ejecutas el programa usando un navegador externo a Eclipse PDT y pulsas


el botón que para la carga de la página (botón ESCAPE del teclado) verás que
la página no termina la carga de la página y se para (es necesario desplazar la
barra vertical del navegador para ver el resultado en la parte inferior):

- 268 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Sin embargo, si dejamos que se ejecute la página hasta que termine su carga
en el navegador veremos que aparece al final de esta página aparece la
palabra “FIN”:

- 269 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Además, si abrimos el archivo “acceso.txt” del proyecto podemos ver el estado


en el que terminaron las conexiones anteriores:

- 270 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Para implementar esta funcionalidad hemos utilizado la función de PHP


error_log() que permite guardar la información en fichero. En el apartado
"Tratamiento de Errores" de la teoría de la Unidad 8 se estudia esta función.

- 271 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Resumen

Hay que saber al final de esta unidad

 Identificar una cookie y conocer la información


que contiene.

 Crear y enviar una cookie al servidor con la


función setcookie().

 Eliminar una cookie con la misma función.

 Leer el contenido de una cookie.

 Utilizar correctamente la función header() para


crear y enviar al servidor una cabecera HTTP.

 Autentificar usuarios, tanto desde el propio


servidor como mediante el envío de las cabeceras
HTTP oportunas.

 Revalidar usuarios.

 Gestionar usuarios que acceden al servidor.

 Abrir una sesión y conocer sus datos con las


funciones session_start(), session_name(),
session_module_name(), session_save_path() y
session_id().

 Destruir una sesión con session_destroy().

 Pasar a una cadena los valores registrados en una


sesión con la función session_encode() y
recuperarlos de la misma con session_decode().

 Conocer el estado de una conexión con la función


connection_status().

 Detectar si el usuario de ha desconectado con la


función connection_aborted().

- 272 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

 Detectar si la conexión ha caducado con la función


connection_timeout() y fijar un nuevo periodo de
conexión con set_time_limit().

 Desactivar la posibilidad de que el usuario se


desconecte finalizando el script php con la
función ignore_user_abort().

 Conocer las capacidades del navegador que estamos


usando con la función get_browser().

 Interrumpir la ejecución de un programa con las


funciones exit() y die().

 Detener temporalmente la ejecución de un programa


con las funciones sleep() y usleep().

- 273 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

- 274 -

You might also like