Está en la página 1de 100

Curso de Desarrollo de

Aplicaciones Web

Dardo Guidobono
dardoguidobono@gmail.com

Marcelo Toledo
marcelotoledo@gmail.com

Tabla de Contenidos

1. Introduccin al Desarrollo de aplicaciones web......................................................1


1.1. Introduccin al funcionamiento de una aplicacin web ...................................1
1.1.1. Funcionamiento del Protocolo HTTP....................................................1
1.1.1.1. HTML y HTTP ...........................................................................1
1.1.1.2. HTTP,HTML y Pginas dinamicas.............................................2
2. El lenguaje PHP .........................................................................................................3
2.1. Introduccin al lenguaje PHP ...........................................................................3
2.1.1. Instalacin del servidor de PHP en nuestra PC......................................3
2.1.2. Mis primeros pasos en PHP....5
2.1.3 Definiendo Variables..............................................................................7
2.1.4 Operadores Aritmticos .........................................................................8
2.1.5 Operadores de comparacin...................................................................9
2.1.6 Operadores Lgicos ...............................................................................9
2.1.7 Sentencias Condicionales.......................................................................10
2.1.8 Bucles en PHP......................................................................................12
2.1.9 Funciones de Impresin .......................................................................14
2.1.10Funciones de Tratamientos de Cadenas ...............................................16
2.1.11 Definicin de Funciones ....................................................................18
2.1.12 Libreras .............................................................................................19
2.2. Arreglos en PHP .............................................................................................20
2.2.1. Matrices: ..............................................................................................20
2.2.2. Recorriendo un arreglo usando la sentencia Foreach...........................21
2.2.3. Colas y Pilas usando vectores en PHP. ................................................21
2.2.3.1. Funcin Alfa .............................................................................22
2.2.4. Funciones especiales para vectores asociativos ...................................22
2.2.5. Funciones para recorrer vectores .........................................................22
2.3. Programacin orientada a objetos en PHP......................................................23
2.3.1. Herencia en Php ...................................................................................23
2.3.2. Polimorfismo........................................................................................26
2.4. PPO en PHP5....................... ....................... ...................................................26
2.4.1. Caracteristicas de PHP5....................... ....................... ................27
2.4.2. Clases en PHP5.............................................................................28
2.4.3 Instanciar Objetos a partir de clases .............................................29
2.4.4 .Destructores en PHP5 ..................................................................31
2.4.5.EL modificador Public ..................................................................33
2.4.6.EL modificador Private..................................................................33
2.4.7.EL modificador Protected..............................................................34
2.4.8.Conclusion de modificadores ........................................................35
2.4.9.Herencia en PHP5 ................ ........................................................35
2.4.10.Atributos y mtodos en PHP5 ......................................................43
2.4.11.Repaso de PPO en PHP5 .... .........................................................51
2.5 Manejo de Formularios con PHP. ...................................................................63
2.51. Breve repaso de los tipos de campos de entrada de formularios HTML...64
2.51.1. Tipo: Text (texto) ......................................................................64
2.51.2. Tipo:Hidden (oculto).................................................................64

2.5.3. Tipo Checkbox:.........................................................................64


2.5.1.4. Tipo Radio Buttons(opcin mltiple): ......................................66
2.5.1.5. Tipo TextArea: ..........................................................................67
2.5.1.6. Tipo Select (lista desplegable) ..................................................68
2.5.1.7. File Uploads..............................................................................69
3. Bases de Datos y SQL (Structured Query Language) ..........................................70
3.1. Introduccin ....................................................................................................70
3.1.1. Que es una Base de Datos (BD)? .......................................................71
3.1.2. SQL(Structured Query Language).......................................................72
3.1.2.1. Comandos .................................................................................73
3.1.2.1.1. Los Comandos DDL [ CREATE , ALTER , DROP ] ....73
3.1.2.1.1.1. Comando CREATE.............................................73
3.1.2.1.1.2. Comando DROP .................................................74
3.1.2.1.1.3. Comando ALTER TABLE..................................74
3.1.2.1.2. Los Comandos DML [ SELECT , INSERT , UPDATE y
DELETE ] ..............................................................................74
3.1.2.1.2.1. Comando SELECT .............................................74
3.1.2.1.2.2. Comando INSERT ..............................................74
3.1.2.1.2.3. Comando UPDATE.............................................75
3.1.2.1.2.4. Comando DELETE.............................................75
3.1.2.2. Clusulas ...................................................................................75
3.1.2.2.1. GROUP BY....................................................................75
3.1.2.2.2. ORDER BY ...................................................................76
3.1.2.3. Funciones ..................................................................................76
3.1.2.3.1. AVG ...............................................................................76
3.1.2.3.2. COUNT..........................................................................76
3.1.2.3.3. MAX , MIN ...................................................................76
3.1.2.3.4. SUM...............................................................................76
4. Acceso a bases de datos usando la librera AdoDB...............................................77
4.1. Introduccin ....................................................................................................77
4.2. Inclusin de la librera en PHP .......................................................................78
4.3. Conexin a una base de datos .........................................................................78
4.4. Ejecucin de una consulta simple ...................................................................79
4.5. Sabiendo la cantidad de registros que retorna una consulta ...........................80
4.6. Insercin de registros usando AdoDB ............................................................80
4.7. Ejemplo de Insercin con generacin de identificadores................................81
4.8. Selects con limites de registros .......................................................................81
4.9. Transacciones y AdoDB .................................................................................82
5. Introduccin al uso de plantillas (Templates)........................................................82
5.1. Introduccin ....................................................................................................82
5.2. Que es una plantilla? .....................................................................................83
5.2.1. Ezfasttemplate......................................................................................84
5.2.1.1. Bloque de plantilla ....................................................................84
5.2.1.2. Variables de Plantilla.................................................................84
5.2.1.3. Funciones de la librera.............................................................84
5.3. Conclusin ......................................................................................................86
6. Persistencia y sesiones en PHP................................................................................86

6.1. Introduccin a las Sesiones.............................................................................86


6.1.1. Qu es una sesin? .............................................................................86
6.1.2. Como inicio una sesin? ....................................................................87
6.1.3. Como elimino una variable de sesin?...............................................88
6.1.4. Como finalizo una sesin? .................................................................88
6.1.5. Funciones Miscelneas de sesiones .....................................................88
6.2. Conclusin sobre el uso de sesiones. ..............................................................88
7. Validacin de Datos..................................................................................................88
7.1. Introduccin ....................................................................................................88
7.1.1. Problemas comunes que se presentan por falta de validaciones..........89
7.1.2. Pasos para desarrollar una validacin exitosa......................................89
7.1.3. Validacin en el lado cliente. ...............................................................89
7.1.4. Validacin en el lado servidor..............................................................89
7.2. Introduccin a Expresiones Regulares............................................................90
7.2.1. Los caracteres especiales que se usan en una expresin regular..........90
7.2.2. Coincidencia total ................................................................................91
7.2.3. Definiendo Rangos con expresiones regulares.....................................92
7.2.4. Usando el operador circunflejo "^" ......................................................92
7.2.5. Uso del operador pesos "$"..................................................................92
7.2.6. Agrupando, referenciando y extrayendo..............................................93
7.2.7. Expresiones opcionales y alternativas..................................................94
7.2.8. Contando expresiones ..........................................................................94
7.2.9. Expresiones repetidas...........................................................................95
7.2.10. Como usar expresiones regulares en PHP..........................................95

Captulo 1. Introduccin al Desarrollo


de aplicaciones web
1.1. Introduccin al funcionamiento de una
aplicacin web

El funcionamiento de un Web-Site es un ejemplo tpico de la arquitectura


cliente-servidor, en donde mltiples clientes se conectan a un servidor en forma
simultanea. En general tipo servidor depende de la instalacin del sitio web, mientras
que el cliente suele ser un browser(navegador), en general Netscape Navigator, Mozilla
o Microsoft Explorer. Como en todo esquema cliente-servidor debe existir un protocolo
que especifique de que forma se comunican e intercambian datos el cliente y el
servidor, el protocolo utilizado en un web site es el HTTP (HiperText Transfer Protocol)

1.1.1. Funcionamiento del Protocolo HTTP

Bsicamente el protocolo es iniciado por el cliente con un "request", es decir un pedido


de un recurso determinado (por medio de un identificador URL), que es siempre
contestado por el server con el envo de una respuesta ("response") que incluye un
cdigo indicando si el pedido pudo ser resuelto por el server o no.
El tipo de pedido puede ser del tipo GET o del tipo POST.

1.1.1.1. HTML y HTTP

Cuando el servidor enva la respuesta a un comando GET o POST retorna un tipo de


archivo (tipo MIME) y luego la respuesta en s.
Los datos que el server enva al browser dependen del "Content-Type" declarado,
Bsicamente los tipos ms usados son texto plano (text/plain), cdigo html (text/html),
o imgenes (image/gif u otros).
De esta forma el cliente y el server se comunican por medio de tantos ciclos
REQUEST-RESPONSE como sean necesarios, es de destacar que por cada REQUEST
se debe iniciar una conexin nueva entre el cliente y el servidor ya que el protocolo
HTTP en su forma bsica no admite que en una misma conexin se haga ms de un
pedido al server. En una pgina html simple con 3 imgenes por ejemplo es normal que
se efecten 4 conexiones al server: una para la pgina y luego una por cada imagen.
Ejemplo: Supongamos que tenemos la siguiente pgina html en un servidor,
supongamos que la direccin del servidor es www.prueba.com y que la pgina se llama
index.html, el ciclo que se da entre el browser y el server es de la siguiente forma:
1. El cliente hace la peticin "GET index.html"
2. El servidor web responde con un tipo mime "text/html" y con la pagina web listada

abajo
3. El cliente analiza el resultado y reconoce que le falta "prueba.jpeg"
4. El cliente hace la peticin "GET imagenes/prueba.jpeg"
5. El servidor web responde con un tipo mime "image/jpeg" y con el contenido de la
imagen
6. El cliente muestra la pgina web completa y espera una accin del usuario
Archivo:index.html

<HTML>
<HEAD>
<TITLE>Ejemplo</TITLE>
</HEAD>
<BODY>
<IMGSRC="imagenes/prueba.jpg">
Hola esta es una prueba
</BODY>
</HTML>
El resultado sera similar al siguiente cuadro, dependiendo de la imagen que colocamos en
imgenes/prueba.jpg

1.1.1.2. HTTP,HTML y Pginas dinamicas

La diferencia entre una peticin de una pgina web esttica (.html) y una pgina web
dinmica (por ejemplo index.php), es el agregado de 1 paso ms dentro de la lista
anteriormente mostrada.
Bsicamente, cuando el servidor recibe la peticin de un archivo con extensin php,
como cualquier pgina, lo primero que hace es buscarla en el disco rgido, pero luego,
antes de devolverla al cliente se la enva al preprocesador PHP, que la interpreta.
Aunque este paso parezca que no le da mucho potencial, no hay que olvidar que el

preprocesador PHP es un intrprete de un lenguaje de programacin totalmente


funcional y que este tambin puede, por ejemplo, conectarse con bases de datos, abrir
archivos, conectarse con otros servidores, etc. con tal de cumplir su objetivo: generar la
pgina html final.

Captulo 2. El lenguaje PHP


2.1. Introduccin al lenguaje PHP
El lenguaje PHP es un lenguaje de programacin de estilo clsico, con esto quiero decir
que es un lenguaje de programacin con variables, sentencias condicionales, bucles,
funciones.... No es un lenguaje de marcas como podra ser HTML, XML o WML. Est
mas cercano a JavaScript o a C, para aquellos que conocen estos lenguajes. Pero a
diferencia de Java o JavaScript que se ejecutan en el navegador, PHP se ejecuta en el
servidor, por eso nos permite acceder a los recursos que tenga el servidor, como por
ejemplo una base de datos. El programa PHP es ejecutado en el servidor y el resultado
enviado al navegador. El resultado es normalmente una pgina HTML pero igualmente
podra ser una pagina WML.
Al ser PHP un lenguaje que se ejecuta en el servidor no es necesario que su navegador
lo soporte, es independiente del navegador, pero sin embargo para que sus pginas PHP
funcionen, el servidor donde estn alojadas debe soportar PHP.

2.1.1. Instalacin del Servidor de PHP en nuestra PC


Antes de comenzar con la practica, lo primero que debemos realizar es instalar los servicios
necesarios para que nuestra PC pueda funcionar como un servidor Web.En Internet podemos encontrar diferentes tipos de instaladores y para diferentes
plataformas (Phptriad para Windows 98, xamp, appserv, wamp, ect para w2000 y XP),
nosotros vamos a instalar el wamp que tiene soporte sobre PHP5
1) Insertar el cd con el instalador y hacer doble clik sobre el instalador

2) Colocar siguiente aceptando los terminos y condiciones que propone la instalacin


hasta llegar a la pantalla en donde pide el path de instalacin como muestra la siguiente
figura

Este path es muy importante pues es donde se realizar la instalacin de nuestro servidor
web.3) Seguir hasta la pantalla siguiente:

En este punto hacer clic en el check de modo que lance automticamente los servicios al
iniciar Windows, luego presionar siguiente e install para finalizar con la instalacin.4

4) Antes de concluir, la instalacin pedir el directorio raiz en donde inicia nuestro servidor
web (Recomendacin, dejar www que es el propuesto por la instalacin)

Aclaracion: Para verificar que los servicios se encuentren corriendo en nuestra pc,
podemos presionar las teclas <ctrl.> + <alt> + <supr> y ver en la pestaa de procesos que
existen dos servicios (Apache y mysql) que estan corriendo, uno para las aplicaciones PHP
y el otro para la base de datos.-

2.1.2. Mis primeros pasos en Php

La ventaja que tiene PHP sobre otros lenguajes de programacin que se ejecutan en el
servidor (como podran ser los script CGI Perl), es que nos permite intercalar las
sentencias PHP en las paginas HTML, es un concepto algo complicado de entender si
no se ha visto nunca como funciona unas paginas PHP o ASP. Vamos a ver un ejemplo
sencillo para comprenderlo mejor. Todo lo que esta entre <?php y ?>
Ejemplo: prueba.php
<html>
<head>

<title>Ejemplo de PHP</title>
</head>
<body>
<b>Parte de HTML normal.</b>
<HR>

Esto es texto HTML


<BR><BR>
<?php
echo "<b>Parte de PHP</b><br><hr>";
for($i=0;$i<10;$i++)
{
echo "Linea ".$i."<br>";
}
?>
</body>
</html>

El cdigo PHP ejecutado tiene dos partes: la primera imprime "Parte de PHP" y la
segunda es un bucle que se ejecuta 10 veces de 0 a 9, por cada vez que se ejecuta se
escribe una lnea, la variable $i contiene el nmero de lnea que se est escribiendo. No
importa si no entiende muy bien el programa este ejemplo solo es para ilustrar como se
intercala el cdigo HTML y el cdigo PHP.
Para realizar la prueba crearemos una carpeta dentro de c:\wamp\www\curso
Y para invocarlo desde el navegador se debe realizar del siguiente modo:
Sabemos que c:\wamp\www\ es la raiz de nuestro servidor porque as lo definimos en la
instalacin, por este motivo cuand colocamos en el navegador http://127.0.0.1 estamos
diciendo que estamos en el raiz de nuestro servidor dado que esa direccion ip equivale a
nuestra placa interna de red.Si estamos trabajando en la misma pc en donde se encuentra en servidor, podemos invocar
a la raiz de diferentes maneras:
http://127.0.0.1/
http://localhost/
http://<direccion IP de la PC>/
http://<nombre de red de la pc>/
Estas dos ultimas sirven para el caso que estemos trabajando en una pc diferente a la que
tiene el servidor web.Entonces si queremos invocar a prueba.php que se encuentra dentro de
c:\wamp\www\curso debemos colocar la siguiente direccion
http://localhost/curso/prueba.php y el resultado se muestra en la siguiente figura:

2.1.3. Definiendo Variables

Una variable es un contenedor de informacin, en el que podemos meter nmeros


enteros, nmeros decimales, caracteres,objetos... el contenido de las variables se puede
leer y se puede cambiar durante la ejecucin de una pgina PHP.
En PHP todas las variables comienzan con el smbolo del dlar $ y no es necesario
definir una variable antes de usarla. Tampoco tienen tipos, es decir que una misma
variable puede contener un nmero y luego puede contener caracteres.
Ejemplo: Prueba2.php

<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<?php
$a = 1;
$b = 3.34;
$c = "Hola Mundo";
echo $a,"<br>",$b,"<br>",$c;
?>

</body>
</html>

En este ejemplo hemos definido tres variables, $a, $b y $c y con la instruccin echo
hemos impreso el valor que contenan, insertando un salto de lnea entre ellas.
Existen 2 tipos de variables, las variables locales que solo pueden ser usadas dentro de
funciones y las variables globales que tienen su mbito de uso fuera de las funciones,
podemos acceder a una variable global desde una funcin con la instruccin global
nombre_variable;

2.1.4. Operadores Aritmticos

Los operadores de PHP son muy parecidos a los de C ,JavaScript o Java, si usted
conoce estos lenguajes le resultaran familiares y fciles de reconocer. Estos son los
operadores que se pueden aplicar a las variables y constantes numricas.
Operador Nombre
+
Suma
Resta
*
Multiplicacin
/
Divisin
%
Mdulo
++
Suma 1
-Resta 1

Ejemplo
5+6
7-9
6*3
4/8
7%2
$a++
$a--

Descripcin
Suma dos nmeros
Resta dos nmeros
Multiplica dos nmeros
Divide dos nmeros
Devuelve el resto la divisin
Suma 1 al contenido de $a.
Resta 1 al contenido de $a.

<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<?php
$a = 8;
$b = 3;

echo $a + $b,"<br>";
echo $a - $b,"<br>";
echo $a * $b,"<br>";
echo $a / $b,"<br>";
$a++;
echo $a,"<br>";
$b--;
echo $b,"<br>";
?>
</body>
</html>
El resultado es el siguiente:

2.1.5. Operadores de comparacin

Los operadores de comparacin son usados para comparar valores y as poder tomar
decisiones.
Operador
Nombre
Ejemplo
Devuelve ciertocuando:
==
Igual
$a == $b
$a es igual $b
!=
Distinto
$a != $b
$a es distinto $b
<
Menor que
$a < $b
$a es menor que $b
>
Mayor que
$a > $b
$a es mayor que $b
<=
Menor o igual $a <= $b
$a es menor o igual que $b
>=
Mayor o igual $a >= $b
$a es mayor o igual que $b

2.1.6. Operadores Lgicos

Los operadores lgicos son usados para evaluar varias comparaciones, combinando los
posibles valores de estas.
Operador
&&
and

Nombre
Y
Y

Ejemplo
(7>2) && (2<4)
(7>2) and (2<4)

Devuelve cierto cuando:


verdadero si ambas son verdaderas
verdadero si ambas son verdaderas
9

||
or
!

O
O
No

(7>2) || (2<4)
(7>2) or (2<4)
! (7>2)

Verdader si al menos una lo es


Verdader si al menos una lo es
Niega el valor de la expresin.

<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<?php
$a = 8;
$b = 3;
$c = 3;
echo ($a == $b) && ($c > $b),"<br>";
echo ($a == $b) || ($b == $c),"<br>";
echo !($b <= $c),"<br>";
?>
</body>
</html>

El resultado es el siguiente:

2.1.7. Sentencias Condicionales

Las sentencias condicionales nos permiten ejecutar o no unas ciertas instrucciones


dependiendo del resultado de evaluar una condicin. Las ms frecuentes son la
instruccin if y la instruccin switch.
Comando if.. else

<?php
if (condicin)
{
Sentencias a ejecutar cuando la
condicin es cierta.
}
else
{
Sentecias a ejecutar cuando la
condicin es falsa.

10

}
?>

La sentencia if ejecuta una serie de instrucciones u otras dependiendo de la condicin


que le pongamos.
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<?php
$a = 8;
$b = 3;
if ($a < $b)
{
echo "a es menor que b";
}
else
{
echo "a no es menor que b";
}
?>
</body>
</html>

Comando switch
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<?php
$posicion = "arriba";
switch($posicion) {
case "arriba": // Bloque 1
echo "La variable contiene";
echo " el valor arriba";
break;

11

case "abajo": // Bloque 2


echo "La variable contiene";
echo " el valor abajo";
break;
default: // Bloque 3
echo "La variable contiene otro valor";
echo " distinto de arriba y abajo";
}
?>
</body>
</html>

Con la sentencia switch podemos ejecutar unas u otras instrucciones dependiendo del
valor de una variable, en el ejemplo anterior, dependiendo del valor de la variable
$posicion se ejecuta el bloque 1 cuando el valor es "arriba", el bloque 2 cuando el
valor es "abajo" y el bloque 3 si no es ninguno de los valores anteriores.

2.1.8. Bucles en PHP

Los bucles nos permiten iterar conjuntos de instrucciones, es decir repetir la ejecucin
de un conjunto de instrucciones mientras se cumpla una condicin.
Sentencia while
<?php
while (condicin)
{
instrucciones a ejecutar.
}
?>

Mientras la condicin sea cierta se reiterar la ejecucin de las instrucciones que estn
dentro del while.
<html>
<head>
<title>Ejemplo de PHP</title>

12

</head>
<body>
Inicio<BR>
<?php
$i=0;
while ($i<10)
{
echo "El valor de i es ", $i,"<br>";
$i++;
}
?>
Final<BR>
</body>
</html>
El resultado muestra a continuacin:

Sentencia for En el siguiente ejemplo, el valor de $i al comienzo es 0, durante la


ejecucin del bucle, se va sumando 1 al valor de $i de manera que cuando $i vale 10
ya no se cumple la condicin y se termina la ejecucin del bucle.
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>

13

Inicio<BR>
<?php
for($i=0 ; $i<10 ; $i++)
{
echo "El valor de i es ", $i,"<br>";
}
?>
Final<BR>
</body>
</html>

El primer parmetro del for, es ejecutado la primera vez y sirve para inicializar la
variable del bucle, el segundo parmetro indica la condicin que se debe cumplir para
que el bucle siga ejecutndose y el tercer parmetro es una instruccin que se ejecuta al
final de cada iteracin y sirve para modificar el valor de la variable de iteracin.

2.1.9. Funciones de Impresin

Hasta ahora hemos usado la instruccin echo para realizar salida a pantalla, esta
instruccin es bastante limitada ya que no nos permite formatear la salida. En esta
pgina veremos la instruccin printf() que nos da mucha ms potencia.
Sentencia printf( cadena formato , var1, var2, varN) La cadena de
formateo indica cmo se han de representar las valores que posteriormente le
indicaremos. La principal ventaja es que adems de poder formatear los valores de
salida, nos permite intercalar texto entre ellos.
<html>

14

<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<?php
printf("El numero dos con diferentes formatos: %d %f %.2f",2,2,2);
?>
</body>
</html>

La cadena de formato puede incluir una seria de caracteres especiales que indican como
formatear las variables que se incluyen en la instruccin.
Formato
%s
%d
%f
%c

ipo de Variable
String
Entero
Nmero Decimal
1 solo carcter

<html>
<head>
<title>Ejemplo de PHP</title>
</head>

13
Captulo 2. El lenguaje PHP

<body>
<?php
$var="texto";
$num=3;
printf("Puede fcilmente intercalar <b>%s</b>
con nmeros <b>%d</b> <br>",$var,$num);
printf("<TABLE BORDER=1 CELLPADDING=20>");
for ($i=0;$i<10;$i++)
{
printf("<tr><td>%10.d</td></tr>",$i);
}

15

printf("</table>");
?>
</body>
</html>

2.1.10. Funciones de Tratamientos de Cadenas

Dado el uso del lenguaje PHP el tratamiento de cadenas es muy importante, existen
bastantes funciones para el manejo de cadenas, a continuacin explicaremos las ms
usadas.
1. strlen(cadena). Nos devuelve el nmero de caracteres de una cadena.
2. split(separador,cadena).Divide una cadena en varias usando un caracter
separador.
3. sprintf(cadena de formato, var1, var2...). Formatea una cadena de
texto al igual que printf pero el resultado es devuelto como una cadena.
4. substr(cadena, inicio, longitud).Devuelve una subcadena de otra,
empezando por inicio y de longitud longitud.
5. chop(cadena). Elimina los saltos de lnea y los espacios finales de una cadena.
6. strpos(cadena1, cadena2).Busca la cadena2 dentro de cadena1
indicndonos la posicin en la que se encuentra.
16

7. str_replace(cadena1, cadena2, texto).Reemplaza la cadena1 por la


cadena2 en el texto.
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<?php
echo strlen("12345"),"<br>";
$palabras=split(" ","Esto es una prueba");
for($i=0;$palabras[$i];$i++)
echo $palabras[$i],"<br>";
$resultado=sprintf("8x5 = %d <br>",8*5);
echo $resultado,"<br>";
echo substr("Devuelve una subcadena de otra",9,3),"<br><br>";
if (chop("Cadena \n\n ") == "Cadena")
echo "Iguales<br><br>";
echo strpos("Busca la palabra dentro de la frase",
"palabra"),"<br><br>";
echo str_replace("verde","rojo",
"Un pez de color verde, como verde es la hierba."),"<br>";
?>
</body>
</html>
El resultado se ve en el siguente cuadro:

17

2.1.11. Definicin de Funciones

El uso de funciones nos da la capacidad de agrupar varias instrucciones bajo un solo


nombre y poder llamarlas a estas varias veces desde diferentes sitios, ahorrndonos la
necesidad de escribirlas de nuevo.
<?php
function Nombre(parametro1, parametro2...)
{
instruccin1;
instruccin2;
instruccin3;
instruccin4;
return valor_de_retorno;
}
?>

Opcionalmente podemos pasarle parmetros a las funciones que se trataran como


variable locales y as mismo podemos devolver un resultado con la instruccin return
valor; Esto produce la terminacin de la funcin retornando un valor.
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<?php
function media_aritmetica($a, $b)
{
$media=($a+$b)/2;
return $media;
}
echo media_aritmetica(4,6),"<br>";
echo media_aritmetica(3242,524543),"<br>";
?>
</body>
</html>
En el siguiente cuadro visualiza el resultado:

18

Precaucin:

Si quiere acceder a una variable global estando dentro de una


funcin antes debe declararla con la sentencia global

2.1.12. Libreras

El uso de libreras es tremendamente til, nos permiten agrupar varias funciones y


variables en un mismo fichero, de manera que luego podemos incluir esta librera en
distintas pginas y disponer de esas funciones fcilmente.
Ejemplo de una librera de 2 funciones que estn el archivo:mi_primera_libreria.php
<?php
function print_cabecera($titulo)
{
echo "<html><head><title> $titulo </title></head><body>";
}
function print_pie(){
echo "</body></html>";
}
?>

Ahora podemos usar las funciones que hemos definido en la librera anterior desde otro
archivo. Para esto podemos usar las funciones include(arch); o require(arch);
<?php
include("mi_primera_libreria.php");
print_cabecera("ESTE ES EL TITULO");
echo "Esto es el cuerpo";
print_pie();
?>
Y el resultado se ve en el siguiente cuadro.

19

2.2. Arreglos en PHP

Los vectores en php actan tanto como vectores tradicionales (indexados por nmero)
as tambin como vectores asociativos (indexados por clave). Los vectores pueden
crearse usando las instrucciones list o array o bien inicializando en forma explcita
cada elemento del vector.
$a[0]="hola"
$a[1]="mundo";
$a["clave"]="valor";

Utilizando la notacin especial $arreglo[]; se pueden agregar elementos al final de un


vector.
$a[0]="nada";
$a[1]="hola";
$a[]="mundo"; //Asigna a $a[2] el valor "mundo".

Existen funciones especiales para ordenar vectores, contar la cantidad de elementos de


los mismos, recorrerlos, etc.

2.2.1. Matrices:

La definicin, inicializacin y uso de matrices en PHP es sencilla. Se puede pensar una


matriz en PHP como un vector de vectores, por lo que se puede utilizar la misma lgica
que en los primeros.
$a[0][1]="Hola";
$a[0]["clave"]="una cosa";
$a["clave1"]["clave2"][0][1]="otra cosa";

Una forma til de inicializar un vector asociativo es usando la siguiente notacin:


$a=array(
"color" => "rojo",
"edad" => 23,
"nombre" => "juan"
);

Para crear una matriz se pueden anidar las declaraciones de tipo array.
$a = array(
"manzana" => array( "color" => "rojo",
"gusto" => "suave",
"forma" => "redondeada"
),
"naranja" => array( "color" => "naranja",
"gusto" => "dulce",
"forma" => "redondeada"),

20

"banana" => array(


"color" => "amarillo",
"gusto" => "pastoso",
"forma" => "banana")
);

2.2.2. Recorriendo un arreglo usando la sentencia


Foreach

Para realizar ciclos con la cantidad de ocurrencias en un vector se utiliza el comando

foreach:

foreach ($vector as $variable) {


sentencias;
}

Por cada iteracin cada elemento de $vector es asignado a $variable.


foreach ($vector as $clave => $valor) {
sentencias;
}

El segundo caso es aplicable para recorrer vectores asociativos, ya que en cada


iteracin se puede saber la clave y el valor de esta.

2.2.3. Colas y Pilas usando vectores en PHP.


PHP cuenta con instrucciones nativas para manipular vectores que permiten utilizar los
mismos como pilas o colas, las instrucciones son:
$variable=array_pop($array);

Elimina del vector el ltimo elemento y lo devuelve en una variable.


array_push($array, $variable);

Agrega un elemento al final del vector con el valor de la variable que se le pasa como
segundo parmetro.
$variable=array_shift($array);

Elimina del vector el primer elemento y lo devuelve en la variable.


array_unshift($array,$variable);

Agrega el elemento pasado al principio del vector desplazando todos los valores.
Usando array_shift y array_pop se pueden implementar colas, usando array_push y
array_pop tenemos una pila.

21

2.2.3.1. Funcin Alfa

PHP soporta una funcin muy usada en programacin funcional que es conocida como
funcin alfa, en php se denomina array_walk y permite aplicar una funcin a todos y
cada uno de los elementos de un vector. La sintaxis es:
array_walk($array,$funcion,$variable_extra);

variable_extra es opcional, se aplica la funcin pasada como parmetro a cada uno de


los elementos del vector, la funcin recibir como parmetro en primer lugar el "valor"
del elemento del array y en segundo lugar la "clave", si el vector no es asociativo la
clave es el numero de ndice (0,1,2...). Si se pasa variable_extra que puede ser cualquier
tipo de PHP incluyendo un objeto la funcin recibe dicha variable como tercer
parmetro.
Ejemplo: array_walk($arreglo_figuras,"dibujar");
Esto llamara a la funcin dibujar para cada elemento del arreglo_figuras, con el valor y
la clave como argumentos de la funcin.

2.2.4. Funciones especiales para vectores asociativos


array=array_keys(array)
Devuelve un vector con todas las claves de un vector
asociativo.
array=array_values(array)
Devuelve un vector con todos los valores de un vector
asociativo.

2.2.5. Funciones para recorrer vectores


En PHP cada vector tiene asociado un puntero interno que apunta a un elemento del
vector y que puede ser usado para recorrer vectores y otras operaciones, las funciones
que operan con el puntero interno son:
reset(array);
Resetea el puntero interno al principio del array.
end(array);
Setea el puntero interno apuntando al ltimo elemento del array
next(array);
Mueve el puntero al prximo elemento del array
prev(array);
Mueve el puntero al ltimo elemento del array
22

current(array);
Devuelve el elemento apuntado actualmente por el puntero interno del
array.
key(array);
Devuelve la clave (ndice) del elemento apuntado actualmente por el
puntero interno del array, si es un vector asociativo devuelve la clave del elemento
actual. Si es un vector comn devuelve el numero de ndice del elemento actual.
array=each(array)
Devuelve un vector clave-valor con los valores correspondientes al
elemento actual del array y adems mueve el puntero al elemento siguiente, si es un
vector asociativo devuelve clave-valor, si es un vector comn devuelve ndice-valor.
Each suele usarse en conjunto con list para recorrer un vector:
Ejemplo:

while(list($clave,$valor)=each($vector)) {
//Hacer algo
}

2.3. Programacin orientada a objetos en PHP

Para comenzar a hablar de programacin orientada a objetos es necesario recordar los


conceptos de la misma.
Estos conceptos varan entre los distintos autores, pero podemos mencionar algunos
que son bsicos y necesarios para cualquier lenguaje del cual pueda decirse que es
orientado a objetos:
Tipos de datos
Herencia
Polimorfismo

abstractos e informacin encapsulada (estado + metodos)

La encapsulacin en PHP se codifica utilizando clases (tipo de objetos que comparten


comportamientos y caractersticas):
<?php

?>

class Persona {
var $nombre;
function setNombre($nom) {
$this->nombre=$nom;
}
function getNombre() {
return $this->nombre;
}
}

23

Las propiedades de los objetos son definidas en PHP utilizando la declaracin "var"
dentro de la clase. Cuando se declara una propiedad la misma no tiene tipo alguno
asignado, hasta que nosotros la asignemos algn valor en particular. Una propiedad
puede ser un entero, un vector, un vector asociativo, e inclusive puede ser otro objeto.
Los mtodos son definidos como funciones, pero se definen dentro de la clase, para
acceder a las propiedades de la instancia de esa clase es necesario referirse a las
propiedades como $this->nombre_propiedad. ($this es el objeto en s). Para
crear una instancia de un objeto debemos usar el operador "new",que nos devuelve en
una variable un objeto de la clase que le estamos indicando.
ejemplo:

$pers = new Persona;


//Una vez instanciado el objeto podemos utilizar sus mtodos con el
//operador "->"
$pers->setNombre("linus");
$nombre=$pers->getNombre();

El mtodo setNombre ejecutado en el objeto $pers hizo que se asigne "linus" a la


propiedad "nombre" de dicha instancia. Notemos en este punto que podramos haber
seteado la propiedad "nombre" con cualquier tipo de variables, por ejemplo un numero.
Para asignarle "linus" a la propiedad "nombre" de nuestro objeto $pers podramos
haber puesto en nuestro cdigo directamente "$pers->nombre=linus;", sin la
necesidad de llamar a ningn mtodo, pero el problema radicara en que en que
estaramos violando la regla de encapsulamiento de los objetos. Una buena prctica de
la programacin orientada a objetos es acceder a las propiedades solamente mediante
mtodos propios de la clase y jams acceder a ellos de otra forma.
Lamentablemente PHP no ofrece la posibilidad de declarar las propiedades privadas,
por lo que el programar en forma "encapsulada" se torna ms una filosofa de
programacin que una obligacin.

2.3.1. Herencia en Php

La herencia en PHP se realiza utilizando la sentencia "extends":


<?php
class Empleado extends Persona {
var $sueldo;
function setSueldo($cant) {
$this->sueldo=$cant;
}
function getSueldo() {
return $this->sueldo;
}
}
?>

24

Los objetos de la clase "Empleado" poseen todas las propiedades y mtodos de su clase
padre "Persona", ms las propiedades y mtodos propios. Ahora podemos ejecutar por
ejemplo los siguientes comandos:
$empleado1=new Empleado; $empleado1->setNombre("julian");
$empleado1->setSueldo(4000);
En PHP una nica clase de objetos no puede ser "hija" de ms de un "padre", lo que es
conocido como herencia mltiple.
En PHP se pueden reescribir mtodos de la clase padre en la clase hijo (sobrecarga).
Para esto slo hace falta volver a definir la funcin en el objeto hijo. Por ejemplo si
queremos redefinir el mtodo getNombre para la clase "Empleado" simplemente
definimos esta funcin en la clase "Empleado".
En las clases se pueden definir constructores. Los constructores son mtodos que se
ejecutan al momento de instanciar la clase (cuando se ejecuta la sentencia new). La
caracterstica para que un mtodo sea el constructor de una clase es que debe tener el
mismo nombre que la clase.
<?php

?>

class Empleado {
var $nombre;
function Empleado($nom) {
$this->setNombre($nom);
}
function setNombre($n) {
$this->nombre=$n;
}
function getNombre() {
return $this->nombre;
}
}

Entonces, se puede crear el objeto de la siguiente manera: $emp=new

Empleado("Marcos Stratus");

Automticamente el constructor asigna "Marcos Stratus" a la propiedad "nombre".


Todos los mtodos, incluyendo los constructores, son funciones normales de php, por
lo que se le pueden asignar valores por omisin.
Supongamos que tenemos el constructor definido de la siguiente manera: function

Empleado($nom="sin nombre", $sueldo=400);

En este caso podemos crear el objeto de la siguiente manera:


25

$obj1 = new Empleado; // nom="sin nombre" y sueldo=400


$obj2 = new Empleado("Pedro"); // nom="pedro" y sueldo=400
$obj3 = new Empleado("Pedro",600); // nom="pedro" y sueldo=600

Los argumentos por omisin son utilizados en PHP y son una va para cuando no hay
valores para pasar por parmetro a las funciones.
Cuando el parmetro no es encontrado por la funcin que es llamada, toma el valor por
omisin que le es especificada en su definicin.
Cuando es creado un objeto de una clase que deriva de otra, se ejecuta slo el
constructor de la misma clase, y no la del padre. Este es un defecto del PHP, ya que es
clsico en los lenguajes orientados a objetos que exista lo que se llama encadenamiento
de constructores. Para hacer esto en PHP es necesario llamar explcitamente el
constructor de la clase padre dentro del constructor de la clase heredera. Esto funciona
porque todos los mtodos de la clase padre se encuentran disponibles en la clase
heredera.
<?php

?>

function Empleado() {
$this->sueldo=400;
$this->Persona(); //Llamada al constructor de la clase padre.
}

2.3.2. Polimorfismo

Polimorfismo se define como la habilidad de un objeto de determinar que mtodo debe


invocar para un objeto pasado como argumento en tiempo de ejecucin. Por ejemplo si
tenemos una clase Figura que tiene un mtodo dibujar() y sus clases Hijas crculo y
rectngulo,
Esto permite por ejemplo que si tenemos un arreglo de figuras (que pueden ser crculos,
rectngulos,etc), nosotros podemos llamar a cada componente del arreglo y enviarle el
mensaje dibujar(), que dependiendo del tipo de figura que sea ejecutara distintas
funciones de dibujo. El polimorfismo es muy fcil de aplicar y utilizar en lenguajes
interpretados como PHP.

2.4 PPO en PHP5


Veamos a continuacin una pequea lista de las nuevas caractersticas de la programacin
orientada a objetos (POO) en PHP5. No vamos a describir exhaustivamente cada
caracterstica. Ya lo haremos ms adelante en este mismo manual.

26

2.4.1 Caracteristicas de PHP5

1.- Nombres fijos para los constructores y destructores


En PHP 5 hay que utilizar unos nombres predefinidos para los mtodos constructores y
destructores (Los que se encargan de resumir las tareas de inicializacin y destruccin de
los objetos. Ahora se han de llamar __construct() y __destruct().
2.- Acceso public, private y protected a propiedades y mtodos
A partir de ahora podemos utilizar los modificadores de acceso habituales de la POO. Estos
modificadores sirven para definir qu mtodos y propiedades de las clases son accesibles
desde cada entorno.
3.- Posibilidad de uso de interfaces
Las interfaces se utilizan en la POO para definir un conjunto de mtodos que implementa
una clase. Una clase puede implementar varias interfaces o conjuntos de mtodos. En la
prctica, el uso de interfaces es utilizado muy a menudo para suplir la falta de herencia
mltiple de lenguajes como PHP o Java. Lo explicaremos con detalle ms adelante.
4.- Mtodos y clases final
En PHP 5 se puede indicar que un mtodo es "final". Con ello no se permite sobrescribir
ese mtodo, en una nueva clase que lo herede. Si la clase es "final", lo que se indica es que
esa clase no permite ser heredada por otra clase.
5.- Operador instanceof
Se utiliza para saber si un objeto es una instancia de una clase determinada.
6.- Atributos y mtodos static
En PHP5 podemos hacer uso de atributos y mtodos "static". Son las propiedades y
funcionalidades a las que se puede acceder a partir del nombre de clase, sin necesidad de
haber instanciado un objeto de dicha clase.
7.- Clases y mtodos abstractos
Tambin es posible crear clases y mtodos abstractos. Las clases abstractas no se pueden
instanciar, se suelen utilizar para heredarlas desde otras clases que no tienen porque ser
abstractas. Los mtodos abstractos no se pueden llamar, se utilizan ms bien para ser
heredados por otras clases, donde no tienen porque ser declarados abstractos.
8.- Constantes de clase
Se pueden definir constantes dentro de la clase. Luego se pueden acceder dichas constantes
a travs de la propia clase.
9.- Funciones que especifican la clase que reciben por parmetro
Ahora se pueden definir funciones y declarar que deben recibir un tipo especfico de objeto.
En caso que el objeto no sea de la clase correcta, se produce un error.
10.- Funcin __autoload()
27

Es habitual que los desarrolladores escriban un archivo por cada clase que realizan, como
tcnica para organizar el cdigo de las aplicaciones. Por esa razn, a veces resulta tedioso
realizar los incluyes de cada uno de los cdigos de las clases que se utilizana en un script.
La funcin __autoload() sirve para intentar incluir el cdigo de una clase que se necesite, y
que no haya sido declarada todava en el cdigo que se est ejecutando.
11.- Clonado de objetos
Si se desea, se puede realizar un objeto a partir de la copia exacta de otro objeto. Para ello
se utiliza la instruccin "clone". Tambin se puede definir el mtodo __clone() para realizar
tareas asociadas con la clonacin de un objeto.

2.4.2 Clases en PHP5


Las clases en Programacin orientada a objetos (POO) son definiciones de los elementos
que forman un sistema, en este caso, definiciones de los objetos que van a intervenir en
nuestros programas.
Un objeto se define indicando qu propiedades y funcionalidades tiene. Justamente esas
declaraciones son lo que es una clase. Cuando se hace una clase simplemente se especifica
qu propiedades y funcionalidades tiene. Por ejemplo, un hombre podra tener como
propiedades el nombre o la edad y como funcionalidades, comer, moverse o estudiar.
En la clase hombre declararamos dos atributos: la edad o el nombre, que seran como dos
variables. Tambin deberamos crear tres mtodos, con los procedimientos a seguir para
que el hombre pueda comer, moverse o estudiar. Estos mtodos se definen declarando
funciones dentro de la clase.
El cdigo para definir una clase se puede ver a continuacin:
class hombre{
var $nombre;
var $edad;
function comer($comida){
//aqu el cdigo del mtodo
}
function moverse($destino){
//aqu el cdigo del mtodo
}
function estudiar($asignatura){
//aqu el cdigo del mtodo
}

28

}
Podr comprobarse que este cdigo no difiere en nada del de las versiones anteriores de
PHP, que ya soportaban ciertas caractersticas de la POO. Esta situacin cambiar a poco
que exploremos las caractersticas ms avanzadas de PHP 5, que implicarn mejoras que no
estaban presentes en las versiones anteriores

2.4.3 Instanciar objetos a partir de clases


Hemos visto que una clase es tan slo una definicin. Si queremos trabajar con las clases
debemos instanciar objetos, proceso que consiste en generar un ejemplar de una clase.
Por ejemplo, tenemos la clase hombre anterior. Con la clase en si no podemos hacer nada,
pero podemos crear objetos hombre a partir de esa clase. Cada objeto hombre tendr unas
caractersticas propias, como la edad o el nombre. Adems podr desempear unas
funciones como comer o moverse, ahora bien, cada uno comer o se mover por su cuenta
cuando le sea solicitado, sin interferir en principio con lo que pueda estar haciendo otro
hombre.
Ya que estamos, vamos a ver cmo se generaran un par de hombres, es decir, cmo se
instanciaran un par de objetos de la clase hombre. Para ello utilizamos el operador new.
$pepe = new hombre();
$juan = new hombre();
Conclusin
Es importante darse cuenta de la diferencia entre un objeto y una clase. La clase es una
definicin de unas caractersticas y funcionalidades, algo abstracto que se concreta con la
instanciacin de un objeto de dicha clase.
Un objeto ya tiene propiedades, con sus valores concretos, y se le pueden pasar mensajes
(llamar a los mtodos) para que hagan cosas.
Vamos a ver qu es un constructor y para que sirven, adems de un sencillo ejemplo
de una clase que define un constructor.
Los constructores se encargan de resumir las acciones de inicializacin de los objetos.
Cuando se instancia un objeto, se tienen que realizar varios pasos en su inicializacin, por
ejemplo dar valores a sus atributos y eso es de lo que se encarga el constructor. Los
constructores pueden recibir unos datos para inicializar los objetos como se desee en cada
caso.
La sintaxis para la creacin de constructor vara con respecto a la de PHP 3 y 4, pues debe
llamarse con un nombre fijo: __construct(). (Son dos guiones bajos antes de la palabra
"construct")
29

A lo largo de los ejemplos de este manual vamos a ir creando un cdigo para gestin de un
videoclub. Vamos a empezar definiendo una clase cliente, que utilizaremos luego en
nuestro programa.
class cliente{
var $nombre;
var $numero;
var $peliculas_alquiladas;
function __construct($nombre,$numero){
$this->nombre=$nombre;
$this->numero=$numero;
$this->peliculas_alquiladas=array();
}

function dame_numero(){
return $this->numero;
}

El constructor en esta clase recibe el nombre y nmero que asignar al cliente, que introduce
luego en sus correspondientes propiedades. Adems inicializa el atributo
pelculas_alquiladas como un array, en este caso vaco porque todava no tiene ninguna
pelcula en su poder.
Nota: En programacin orientada a objetos $this hace referencia al objeto sobre el
que se est ejecutando el mtodo. En este caso, como se trata de un constructor,
$this hace referencia al objeto que se est construyendo. Con $this>nombre=$nombre; estamos asignando al atributo nombre del objeto que se
est construyendo el valor que contiene la variable $nombre, que se ha recibido
por parmetro.
Luego hemos creado un mtodo muy sencillo para poder utilizar el objeto. Vamos a ver
unas acciones simples para ilustrar el proceso de instanciacin y utilizacin de los objetos.
//instanciamos un par de objetos cliente
$cliente1 = new cliente("Pepe", 1);
$cliente2 = new cliente("Roberto", 564);
//mostramos el numero de cada cliente creado
echo "El identificador del cliente 1 es: " . $cliente1->dame_numero();
echo "El identificador del cliente 2 es: " . $cliente2->dame_numero();
Este ejemplo obtendra esta salida como resultado de su ejecucin:

30

El identificador del cliente 1 es: 1


El identificador del cliente 2 es: 564

2.4.4 Destructores en PHP5


Los destructores son funciones que se encargan de realizar las tareas que se necesita
ejecutar cuando un objeto deja de existir. Cuando un objeto ya no est referenciado por
ninguna variable, deja de tener sentido que est almacenado en la memoria, por tanto, el
objeto se debe destruir para liberar su espacio. En el momento de su destruccin se llama a
la funcin destructor, que puede realizar las tareas que el programador estime oportuno
realizar.
La creacin del destructor es opcional. Slo debemos crearlo si deseamos hacer alguna cosa
cuando un objeto se elimine de la memoria.
El destructor es como cualquier otro mtodo de la clase, aunque debe declararse con un
nombre fijo: __destruct().
En el cdigo siguiente vamos a ver un destructor en funcionamiento. Aunque la accin que
realiza al destruirse el objeto no es muy til, nos puede servir bien para ver cmo trabaja.
class cliente{
var $nombre;
var $numero;
var $peliculas_alquiladas;
function __construct($nombre,$numero){
$this->nombre=$nombre;
$this->numero=$numero;
$this->peliculas_alquiladas=array();
}
function __destruct(){
echo "<br>destruido: " . $this->nombre;
}

function dame_numero(){
return $this->numero;
}

//instanciamos un par de objetos cliente


31

$cliente1 = new cliente("Pepe", 1);


$cliente2 = new cliente("Roberto", 564);
//mostramos el numero de cada cliente creado
echo "El identificador del cliente 1 es: " . $cliente1->dame_numero();
echo "<br>El identificador del cliente 2 es: " . $cliente2->dame_numero();
Este cdigo es igual que el anterior. Slo se ha aadido el destructor, que imprime un
mensaje en pantalla con el nombre del cliente que se ha destruido. Tras su ejecucin
obtendramos la siguiente salida.
El identificador del cliente 1 es: 1
El identificador del cliente 2 es: 564
destruido: Pepe
destruido: Roberto
Como vemos, antes de acabar el script, se libera el espacio en memoria de los objetos, con
lo que se ejecuta el destructor y aparece el correspondiente mensaje en la pgina.
Un objeto puede quedar sin referencias y por lo tanto ser destruido, por muchas razones.
Por ejemplo, el objeto puede ser una variable local de una funcin y al finalizarse la
ejecucin de esa funcin la variable local dejara de tener validez, con lo que debe
destruirse.
El cdigo siguiente ilustra cmo una variable local a cualquier mbito (por ejemplo, local a
una funcin), se destruye cuando ese mbito ha finalizado.
function crea_cliente_local(){
$cliente_local = new cliente("soy local", 5);
}
crea_cliente_local()
La funcin simplemente crea una variable local que contiene la instanciacin de un cliente.
Cuando la funcin se acaba, la variable local deja de existir y por lo tanto se llama al
destructor definido para ese objeto.
Nota: Tambin podemos deshacernos de un objeto sin necesidad que acabe el
mbito donde fue creado. Para ello tenemos la funcin unset() que recibe una
variable y la elimina de la memoria. Cuando se pierde una variable que contiene
un objeto y ese objeto deja de tener referencias, se elimina al objeto y se llama al
destructor.
Son los Public, Protected y Private, que pueden conocerse porque ya se utilizan en
otros lenguajes orientados a objetos.
Veremos en este captulo los nuevos modificadores de acceso a los mtodos y atributos de
los objetos que se han incorporado en PHP 5. Estos modificadores de acceso no son otros

32

que los conocidos public, protected y private, que ya disponen otros lenguajes como Java.
Uno de los principios de la programacin orientada a objetos es la encapsulacin, que es un
proceso por el que se ocultan las caractersticas internas de un objeto a aquellos elementos
que no tienen porque conocerla. Los modificadores de acceso sirven para indicar los
permisos que tendrn otros objetos para acceder a sus mtodos y propiedades.

2.4.5 EL Modificador Public


Es el nivel de acceso ms permisivo. Sirve para indicar que el mtodo o atributo de la clase
es pblico. En este caso se puede acceder a ese atributo, para visualizarlo o editarlo, por
cualquier otro elemento de nuestro programa. Es el modificador que se aplica si no se
indica otra cosa.
Veamos un ejemplo de clase donde hemos declarado como public sus elementos, un
mtodo y una propiedad. Se trata de la clase "dado", que tiene un atributo con su
puntuacin y un mtodo para tirar el dado y obtener una nueva puntuacin aleatoria.
class dado{
public $puntos;
function __construct(){
srand((double)microtime()*1000000);
}

public function tirate(){


$this->puntos=$randval = rand(1,6);
}

$mi_dado = new dado();


for ($i=0;$i<30;$i++){
$mi_dado->tirate();
echo "<br>Han salido " . $mi_dado->puntos . " puntos";
}
Vemos la declaracin de la clase dado y luego unas lneas de cdigo para ilustrar su
funcionamiento. En el ejemplo se realiza un bucle 30 veces, en las cuales se tira el dado y
se muestra la puntuacin que se ha obtenido.
Como el atributo $puntos y el mtodo tirate() son pblicos, se puede acceder a ellos desde
fuera del objeto, o lo que es lo mismo, desde fuera del cdigo de la clase.

2.4.6 EL Modificador Private


33

Es el nivel de acceso ms restrictivo. Sirve para indicar que esa variable slo se va a poder
acceder desde el propio objeto, nunca desde fuera. Si intentamos acceder a un mtodo o
atributo declarado private desde fuera del propio objeto, obtendremos un mensaje de error
indicando que no es posible a ese elemento.
Si en el ejemplo anterior hubiramos declarado private el mtodo y la propiedad de la clase
dado, hubiramos recibido un mensaje de error.
Aqu tenemos otra posible implementacin de la clase dado, declarando como private el
atributo puntos y el mtodo tirate().
class dado{
private $puntos;
function __construct(){
srand((double)microtime()*1000000);
}
private function tirate(){
$this->puntos=$randval = rand(1,6);
}

public function dame_nueva_puntuacion(){


$this->tirate();
return $this->puntos;
}

$mi_dado = new dado();


for ($i=0;$i<30;$i++){
echo "<br>Han salido " . $mi_dado->dame_nueva_puntuacion() . " puntos";
}
Hemos tenido que crear un nuevo mtodo pblico para operar con el dado, porque si es
todo privado no hay manera de hacer uso de l. El mencionado mtodo es
dame_nueva_puntuacin(), que realiza la accin de tirar el dado y devolver el valor que ha
salido.

2.4.7 EL Modificador Protected


Este indica un nivel de acceso medio y un poco ms especial que los anteriores. Sirve para
que el mtodo o atributo sea pblico dentro del cdigo de la propia clase y de cualquier
clase que herede de aquella donde est el mtodo o propiedad protected. Es privado y no
accesible desde cualquier otra parte. Es decir, un elemento protected es pblico dentro de la
propia clase y en sus heredadas.

34

Ms adelante explicaremos la herencia y podremos ofrecer ejemplos con el modificador


protected.

2.4.8 Conclusion de modificadores


Muchas veces el propio desarrollador es el que fija su criterio a la hora de aplicar los
distintos modificadores de acceso a atributos y mtodos. Poca proteccin implica que los
objetos pierdan su encapsulacin y con ello una de las ventajas de la POO. Una proteccin
mayor puede hacer ms laborioso de generar el cdigo del programa, pero en general es
aconsejable.

2.4.9 Herencia en PHP5


Explicamos la herencia en PHP 5, un proceso por el cual los objetos pueden heredar las
caractersticas de otros, de modo que se pueden hacer objetos especializados, basados en
otros ms generales.
La herencia es uno de los mecanismos fundamentales de la programacin orientada a
objetos. Por medio de la herencia, se pueden definir clases a partir de la declaracin de
otras clases. Las clases que heredan incluyen tanto los mtodos como las propiedades de la
clase a partir de la que estn definidos.
Por ejemplo, pensemos en la clase "vehculo". Esta clase general puede incluir las
caractersticas generales de todos los vehculos (atributos de la clase), como la matrcula,
ao de fabricacin y potencia. Adems, incluir algunas funcionalidades (mtodos de la
clase) como podran ser, arrancar() o moverse().
Ahora bien, en la prctica existen varios tipos de vehculos, como los coches, los autobuses
y los camiones. Todos ellos tienen unas caractersticas comunes, que han sido definidas en
la clase vehculo. Adems, tendrn una serie de caractersticas propias del tipo de vehculo,
que, en principio, no tienen otros tipos de vehculos. Por ejemplo, los camiones pueden
tener una carga mxima permitida o los autobuses un nmero de plazas disponibles. Del
mismo modo, las clases ms especficas pueden tener unas funcionalidades propias, como
los camiones cargar() y descargar(), o los autobuses aceptar_pasajeros() o vender_billete().
Lo normal en sistemas de herencia es que las clases que heredan de otras incluyan nuevas
caractersticas y funcionalidades, aparte de los atributos y mtodos heredados. Pero esto no
es imprescindible, de modo que se pueden crear objetos que hereden de otros y no incluyan
nada nuevo.
Sintaxis de herencia en PHP 5
La programacin orientada a objetos nos ofrece una serie de mecanismos para definir este
tipo de estructuras, de modo que se puedan crear jerarquas de objetos que heredan unos de
35

otros. Veremos ahora cmo definir estas estructuras de herencia en PHP 5. Para ello,
continuando con nuestro ejemplo de video club, vamos a crear los distintos tipos de
elementos que se ofrecen en alquiler.
Como todo el mundo conoce, los video clubs ofrecen distintos tipos de elementos para
alquiler, como pueden ser las pelculas (cintas de vdeo o DVD) y los juegos. Cada
elemento tiene unas caractersticas propias y algunas comunes. Hemos llamado "soporte" a
la clase general, que incluye las caractersticas comunes para todos los tipos de elementos
en alquiler. Luego hemos creado tres tipos de soportes distintos, que heredan de la clase
soporte, pero que incluyen algunas caractersticas y funcionalidades nuevas. Estos tipos de
soporte sern "cinta_video", "dvd" y "juego".
El esquema de herencia que vamos a realizar en este ejemplo se puede ver en la siguiente
imagen.

Empezamos por la clase soporte. Su cdigo ser el siguiente:


class soporte{
public $titulo;
protected $numero;
private $precio;
function __construct($tit,$num,$precio){
$this->titulo = $tit;
$this->numero = $num;
$this->precio = $precio;
}
public function dame_precio_sin_iva(){
return $this->precio;
}
public function dame_precio_con_iva(){
return $this->precio * 1.16;
36

}
public function dame_numero_identificacion(){
return $this->numero;
}

public function imprime_caracteristicas(){


echo $this->titulo;
echo "<br>" . $this->precio . " (IVA no incluido)";
}

Los atributos que hemos definido son, ttulo, numero (un identificador del soporte) y
precio. Hemos aplicado a cada uno un modificador de acceso distinto, para poder practicar
los distintos tipos de acceso.
Hemos definido un constructor, que recibe los valores para la inicializacin del objeto. Un
mtodo dame_precio_sin_iva(), que devuelve el precio del soporte, sin aplicarle el IVA.
Otro mtodo dame_precio_con_iva(), que devuelve el precio una vez aplicado el 16% de
IVA. El mtodo dame_numero_identificacion(), que devuelve el nmero de identificador y
imprime_caracteristicas(), que muestra en la pgina las caractersticas de este soporte.
Nota: Como se ha definido como private el atributo precio, este atributo slo se
podr acceder dentro del cdigo de la clase, es decir, en la propia definicin del
objeto. Si queremos acceder al precio desde fuera de la clase (algo muy normal si
tenemos en cuenta que vamos a necesitar el precio de un soporte desde otras
partes de la aplicacin) ser necesario crear un mtodo que nos devuelva el valor
del precio. Este mtodo debera definirse como public, para que se pueda acceder
desde cualquier sitio que se necesite.
En todos los mtodos se hace uso de la variable $this. Esta variable no es ms que una
referencia al objeto sobre el que se est ejecutando el mtodo. En programacin orientada a
objetos, para ejecutar cualquiera de estos mtodos, primero tenemos que haber creado un
objeto a partir de una clase. Luego podremos llamar los mtodos de un objeto. Esto se hace
con $mi_objeto->metodo_a_llamar(). Dentro de mtodo, cuando se utiliza la variable $this,
se est haciendo referencia al objeto sobre el que se ha llamado al mtodo, en este caso, el
objeto $mi_objeto. Con $this->titulo estamos haciendo referencia al atributo "titulo" que
tiene el objeto $mi_objeto.
Si queremos probar la clase soporte, para confirmar que se ejecuta correctamente y que
ofrece resultados coherentes, podemos utilizar un cdigo como el siguiente.
$soporte1 = new soporte("Los Intocables",22,3);
echo "<b>" . $soporte1->titulo . "</b>";
echo "<br>Precio: " . $soporte1->dame_precio_sin_iva() . " euros";
echo "<br>Precio IVA incluido: " . $soporte1->dame_precio_con_iva() . " euros";

37

En este caso hemos creado una instancia de la clase soporte, en un objeto que hemos
llamado $soporte1. Luego imprimimos su atributo titulo (como el ttulo ha sido definido
como public, podemos acceder a l desde fuera del cdigo de la clase.
Luego se llaman a los mtodos dame_precio_sin_iva() y dame_precio_con_iva() para el
objeto creado.
Nos dara como resultado esto:
Los Intocables
Precio: 3 euros
Precio IVA incluido: 3.48 euros
En siguientes captulos vamos a ver cmo definir clases que hereden de la clase soporte.
Continuamos con los mecanismos de herencia en PHP5. Creamos clases que heredan
de otra clase y aprendemos a sobrescribir mtodos.
Como estamos viendo, los mecanismos de herencia en PHP5 son similares a los existentes
en otros lenguajes de programacin. Ahora vamos a relatar cmo construir una clase que
hereda de otra.
Continuando con nuestro ejemplo de videoclub, vamos a construir una clase para los
soportes de tipo cinta de video. Las cintas de vdeo tienen un atributo nuevo que es la
duracin de la cinta. No tienen ninguna clase nueva, aunque debemos aprender a
sobrescribir mtodos creados para el soporte, dado que ahora tienen que hacer tareas ms
especficas.
Sobrescribir mtodos
Antes de mostrar el cdigo de la clase cinta_video, vamos a hablar sobre la sobrescritura o
sustitucin de mtodos, que es un mecanismo por el cual una clase que hereda puede
redefinir los mtodos que est heredando.
Pensemos en una cafetera. Sabemos que existen muchos tipos de cafeteras y todas hacen
caf, pero el mecanismo para hacer el caf es distinto dependiendo del tipo de cafetera.
Existen cafeteras express, cafeteras por goteo y hasta se puede hacer caf con un calcetn.
Nuestra cafetera "padre" (de la que va a heredar todas las cafeteras) puede tener definido un
mtodo hacer_cafe(), pero no necesariamente todas las cafeteras que puedan heredar de esta
hacen el caf siguiendo el mismo proceso.
Entonces podemos definir un mtodo para hacer caf estndar, que tendra la clase cafetera.
Pero al definir las clases cafetera_express y cafetera_goteo, deberamos sobrescribir el
mtodo hacer_cafe() para que se ajuste al procedimiento propio de estas.
La sobrescritura de mtodos es algo bastante comn en mecanismos de herencia, puesto
38

que los mtodos que fueron creados para una clase "padre" no tienen por qu ser los
mismos que los definidos en las clases que heredan.
Veremos cmo sobrescribir o sustituir mtodos en un ejemplo de herencia, siguiendo
nuestro ejemplo de videoclub.
Sintaxis para heredar en PHP 5
Habamos comentado que el videoclub dispone de distintos elementos para alquilar, como
cintas de vdeo, DVD o juegos. Habamos creado una clase soporte, que vamos a heredar en
cada uno de los elementos disponibles para alquiler. Vamos a empezar por la clase
cinta_video, cuyo cdigo ser el siguiente.
class cinta_video extends soporte{
private $duracion;
function __construct($tit,$num,$precio,$duracion){
parent::__construct($tit,$num,$precio);
$this->duracion = $duracion;
}

public function imprime_caracteristicas(){


echo "Pelcula en VHS:<br>";
parent::imprime_caracteristicas();
echo "<br>Duracin: " . $this->duracion;
}

Con la primera lnea class cinta_video extends soporte estamos indicando que se est
definiendo la clase cinta_video y que va a heredar de la clase soporte.
Nota: Como se est heredando de una clase, PHP tiene que conocer el cdigo de
la clase "padre", en este caso la clase soporte. De modo que el cdigo de la clase
soporte debe estar incluido dentro del archivo de la clase cinta_video. Podemos
colocar los dos cdigos en el mismo fichero, o si estn en ficheros independientes,
debemos incluir el cdigo de la clase soporte con la instruccin include o require
de PHP.
En la clase cinta_video hemos definido un nuevo atributo llamado $duracion, que almacena
el tiempo que dura la pelcula.
Aunque la clase sobre la que heredamos (la clase soporte) tena definido un constructor, la
cinta de vdeo debe inicializar la nueva propiedad $duracion, que es especfica de las cintas
de video. Por ello, vamos a sobrescribir o sustituir el mtodo constructor, lo que se hace
simplemente volviendo a escribir el mtodo. La gracia aqu consiste en que el sistema

39

puede basar la nueva declaracin del constructor en la declaracin que exista para la clase
de la que hereda.
Es decir, ya se haba definido un constructor para la clase soporte, que inicializaba los
atributos de esta clase. Ahora, para la clase cinta_video, hay que inicializar los atributos
definidos en la clase soporte, ms el atributo $duracion, que es propio de cinta_video.
El cdigo del constructor es el siguiente:
function __construct($tit,$num,$precio,$duracion){
parent::__construct($tit,$num,$precio);
$this->duracion = $duracion;
}
En la primera lnea del constructor se llama al constructor creado para la clase "soporte".
Para ello utilizamos parent:: y luego el nombre del mtodo de la clase padre al que se
quiere llamar, en este caso __constructor(). Al constructor de la clase padre le enviamos las
variables que se deben inicializar con la clase padre.
En la segunda lnea del constructor se inicializa el atributo duracion, con lo que hayamos
recibido por parmetro.
Nos pasa lo mismo con el mtodo imprime_caracteristicas(), que ahora debe mostrar
tambin el nuevo atributo, propio de la clase cinta_video. Como se puede observar en el
cdigo de la funcin, se hace uso tambin de parent::imprime_caracteristicas() para utilizar
el mtodo definido en la clase padre.
Si queremos probar la clase cinta_video, podriamos utilizar un cdigo como este:
$micinta = new cinta_video("Los Otros", 22, 4.5, "115 minutos");
echo "<b>" . $micinta->titulo . "</b>";
echo "<br>Precio: " . $micinta->dame_precio_sin_iva() . " euros";
echo "<br>Precio IVA incluido: " . $micinta->dame_precio_con_iva() . " euros";
Lo que nos devolvera lo siguiente:
Los Otros
Precio: 4.5 euros
Precio IVA incluido: 5.22 euros
Pelcula en VHS:
Los Otros
4.5 (IVA no incluido)
Duracin: 115 minutos
Creamos otras clases a partir de una clase padre, para continuar con nuestro ejemplo
de videoclub.

40

La clase soporte tiene otras clases que heredan de ella y que todava no hemos definido.
Veamos primero el cdigo de la clase "dvd", que es muy parecido al visto para la clase
cinta_video. Lo nico que cambia es que ahora vamos a definir otros atributos relacionados
con los DVD, como son los idiomas disponibles en el DVD y el formato de pantalla que
tiene la grabacin.
class dvd extends soporte{
public $idiomas_disponibles;
private $formato_pantalla;

function __construct($tit,$num,$precio,$idiomas,$pantalla){
parent::__construct($tit,$num,$precio);
$this->idiomas_disponibles = $idiomas;
$this->formato_pantalla = $pantalla;
public function imprime_caracteristicas(){
echo "Pelcula en DVD:<br>";
parent::imprime_caracteristicas();
echo "<br>" . $this->idiomas_disponibles;
}
Nota:Para una explicacin detallada de este cdigo os referimos al captulo
anterior, donde se explicaba la clase cinta_video y la sobrescritura de mtodos.

Por su parte, la clase juego, tendr 3 nuevos atributos. Estos son "consola", para especificar
la consola para la que est creado este juego, "min_num_jugadores", para especificar el
nmero de jugadores mnimo y "max_num_jugadores", para especificar el mximo nmero
de jugadores que pueden participar en el juego.
Este ser el cdigo de la clase juego.
class juego extends soporte{
public $consola; //nombre de la consola del juego ej: playstation
private $min_num_jugadores;
private $max_num_jugadores;
function __construct($tit,$num,$precio,$consola,$min_j,$max_j){
parent::__construct($tit,$num,$precio);
$this->consola = $consola;
$this->min_num_jugadores = $min_j;

41

$this->max_num_jugadores = $max_j;

public function imprime_jugadores_posibles(){


if ($this->min_num_jugadores == $this->max_num_jugadores){
if ($this->min_num_jugadores==1)
echo "<br>Para un jugador";
else
echo "<br>Para " . $this->min_num_jugadores . " jugadores";
}else{
echo "<br>De " . $this->min_num_jugadores . " a " . $this->max_num_jugadores . "
Jugadores.";
}
}

public function imprime_caracteristicas(){


echo "Juego para: " . $this->consola . "<br>";
parent::imprime_caracteristicas();
echo "<br>" . $this->imprime_jugadores_posibles();
}

Nos fijamos en el constructor, que llama al constructor de la clase padre para inicializar
algunos atributos propios de los soportes en general.
Luego nos fijamos en el mtodo imprime_jugadores_posibles(), que muestra los jugadores
permitidos. Ha sido declarada como public, para que se pueda acceder a ella desde
cualquier lugar. Nos da un mensaje como "Para un jugador" o "De 1 a 2 Jugadores",
dependiendo de los valores min_num_jugadores y max_num_jugadores.
Por su parte, se sobrescribe la funcin imprime_caracteristicas(), para mostrar todos los
datos de cada juego. Primero se muestra la consola para la que se ha creado el juego. Los
datos generales (propios de la clase "soporte") se muestran llamando al mismo mtodo de la
clase "parent" y el nmero de jugadores disponibles se muestra con una llamada al mtodo
imprime_jugadores_posibles().
Podramos utilizar un cdigo como el que sigue, si es que queremos comprobar que la clase
funciona correctamente y que nos ofrece la salida que estbamos pensando.
$mijuego = new juego("Final Fantasy", 21, 2.5, "Playstation",1,1);
$mijuego->imprime_caracteristicas();
//esta lnea dara un error porque no se permite acceder a un atributo private del objeto
//echo "<br>Jugadores: " . $mijuego->min_num_jugadores;
//habria que crear un mtodo para que acceda a los atributos private
$mijuego->imprime_jugadores_posibles();

42

echo "<p>";
$mijuego2 = new juego("GP Motoracer", 27, 3, "Playstation II",1,2);
echo "<b>" . $mijuego2->titulo . "</b>";
$mijuego2->imprime_jugadores_posibles();
Este cdigo que utiliza la clase "juego" dar como salida:
Juego para: Playstation
Final Fantasy
2.5 (IVA no incluido)
Para un jugador
Para un jugador
GP Motoracer
De 1 a 2 Jugadores.

2.4.9 Atributos y mtodos en PHP5

Los atributos o propiedades de los objetos pueden ser de cualquier tipo, incluso pueden ser
otros objetos.
Las caractersticas de los objetos, que se almacenan por medio de los llamados atributos o
propiedades, pueden ser de diversa naturaleza. La clase hombre puede tener distintos tipos
de atributos, como la edad (numrico), el nombre propio (tipo cadena de caracteres), color
de piel (que puede ser un tipo cadena de caracteres o tipo enumerado, que es una especie de
variable que slo puede tomar unos pocos valores posibles). Tambin puede tener una
estatura o un peso (que podran ser de tipo float o nmero en coma flotante).
En general, podemos utilizar cualquier tipo para los atributos de los objetos, incluso
podemos utilizar otros objetos. Por ejemplo, podramos definir como atributo de la clase
hombre sus manos. Dada la complejidad de las manos, estas podran definirse como otro
objeto. Por ejemplo, las manos tendran como caractersticas la longitud de los dedos, un
coeficiente de elasticidad. Como funcionalidades o mtodos, podramos definir agarrar
algo, soltarlo, pegar una bofetada, o cortarse las uas. As pues, uno de los atributos de la
clase hombre podra ser un nuevo objeto, con su propias caractersticas y funcionalidades.
La complejidad de las manos no le importa al desarrollador de la clase hombre, por el
principio de encapsulacin, dado que este conoce sus propiedades (o aquellas declaradas
como public) y los mtodos (tambin los que se hayan decidido declarar como pblicos) y
no necesita preocuparse sobre cmo se han codificado.
Clase cliente del videoclub
Para continuar el ejemplo del videoclub, hemos creado la clase cliente que vamos a explicar
a continuacin. En los clientes hemos definido como atributo, entre otros, las pelculas o
juegos alquilados.

43

Nota:Como vemos, los objetos pueden tener algunos atributos tambin de tipo
objeto. En ese caso pueden haber distintos tipos de relaciones entre objetos. Por
ejemplo, por pertenencia, como en el caso de la clase hombre y sus manos, pues a
un hombre le pertenecen sus manos. Tambin se pueden relacionar los objetos por
asociacin, como es el caso de los clientes y las pelculas que alquilan, pues en ese
caso un cliente no tiene una pelcula propiamente dicha, sino que se asocia con
una pelcula momentneamente.
La clase cliente que hemos creado tiene cierta complejidad, esperamos que no sea
demasiada para que se pueda entender fcilmente. La explicaremos poco a poco para
facilitar las cosas.
Atributos de la clase cliente
Hemos definido una serie de atributos para trabajar con los clientes. Tenemos los
siguientes:
public $nombre;
private $numero;
private $soportes_alquilados;
private $num_soportes_alquilados;
private $max_alquiler_concurrente;
Como se puede ver, se han definido casi todos los atributos como private, con lo que slo
se podrn acceder dentro del cdigo de la clase.
El atributo nombre, que guarda el nombre propio del cliente, es el nico que hemos dejado
como pblico y que por tanto se podr referenciar desde cualquier parte del programa,
incluso desde otras clases. El atributo numero se utiliza para guardar el identificador
numrico del cliente. Por su parte, soportes alquilados nos servir para asociar al cliente las
pelculas o juegos cuando este las alquile. El atributo num_soportes_alquilados almacenar
el nmero de pelculas o juegos que un cliente tiene alquilados en todo momento. Por
ltimo, max_alquiler_concurrente indica el nmero mximo de soportes que puede tener
alquilados un cliente en un mismo instante, no permitindose alquilar a ese cliente, a la vez,
ms que ese nmero de pelculas o juegos.
El nico atributo sobre el que merece la pena llamar la atencin es soportes_alquilados, que
contendr un array de soportes. En cada casilla del array se introducirn las pelculas o
juegos que un cliente vaya alquilando, para asociar esos soportes al cliente que las alquil.
El array contendr tantas casillas como el max_alquiler_concurrente, puesto que no tiene
sentido asignar mayor espacio al array del que se va a utilizar. Para facilitar las cosas,
cuando un cliente no tiene alquilado nada, tendr el valor null en las casillas del array.
Nota:Recordemos que los soportes fueron definidos en captulos anteriores de
este manual de PHP 5 , mediante un mecanismo de herencia. Soporte era una clase

44

de la que heredaban las pelculas en DVD, las cintas de vdeo y los juegos.
Constructor de la clase cliente
function __construct($nombre,$numero,$max_alquiler_concurrente=3){
$this->nombre=$nombre;
$this->numero=$numero;
$this->soportes_alquilados=array();
$this->num_soportes_alquilados=0;
$this->max_alquiler_concurrente = $max_alquiler_concurrente;
//inicializo las casillas del array de alquiler a "null"
//un valor "null" quiere decir que el no hay alquiler en esa casilla
for ($i=0;$i<$max_alquiler_concurrente;$i++){
$this->soportes_alquilados[$i]=null;
}
}
El constructor de la clase cliente recibe los datos para inicializar el objeto. Estos son
$nombre, $numero y $max_alquiler_concurrente. Si nos fijamos, se ha definido por defecto
a 3 el nmero mximo de alquileres que puede tener un cliente, de modo que, en el caso de
que la llamada al constructor no enve el parmetro $max_alquiler_concurrente se asumir
el valor 3.
El atributo soportes_alquilados, como habamos adelantado, ser un array que tendr tantas
casillas como el mximo de alquileres concurrentes. En las ltimas lneas se inicializan a
null el contenido de las casillas del array.
Continuacin del artculo sobre las propiedades de los objetos.
Mtodo dame_numero()
function dame_numero(){
return $this->numero;
}
Este mtodo simplemente devuelve el numero de identificacin del cliente. Como se ha
definido el atributo numero como private, desde fuera del cdigo de la clase, slo se podr
acceder a este a travs del mtodo dame_numero().
Mtodo tiene_alquilado($soporte)
function tiene_alquilado($soporte){
for ($i=0;$i<$this->max_alquiler_concurrente;$i++){
if (!is_null($this->soportes_alquilados[$i])){

45

if ($this->soportes_alquilados[$i]->dame_numero_identificacion() == $soporte>dame_numero_identificacion()){
return true;
}
}
}
//si estoy aqui es que no tiene alquilado ese soporte
return false;
}
Este recibe un soporte y devuelve true si est entre los alquileres del cliente. Devuelve false
en caso contrario.
A este mtodo lo llamamos desde dentro de la clase cliente, en la codificacin de otro
mtodo. Podramos haber definido entonces el mtodo como private, si penssemos que
slo lo vamos a utilizar desde dentro de esta clase. En este caso lo hemos definido como
public (el modificador por defecto) porque pensamos que puede ser til para otras partes
del programa.
Este mtodo recibe un soporte (cualquier tipo de soporte, tanto cintas de vdeo, como
DVDs o juegos). Realiza un recorrido por el array de soportes alquilados preguntando a
cada soporte que tenga alquilado el cliente si su nmero de identificacin es igual que el del
soporte recibido por parmetro. Como el nmero de identificacin del soporte est definido
como private en la clase soporte, para acceder a su valor tenemos que utilizar el mtodo de
soporte dame_numero_identificacin().
Otra cosa importante. Como no es seguro que en el array de soportes alquilados haya algn
soporte (recordamos que si el cliente no tiene nada alquilado las casillas estn a null), antes
de llamar a ningn mtodo del soporte debemos comprobar que realmente existe. Esto se
hace con la funcin is_null() a la que le enviamos la casilla del array donde queremos
comprobar si existe un soporte. Si la funcin is_null() devuelve true es que tiene
almacenado el valor null, con lo que sabremos que no hay soporte. De manera contraria, si
la casilla almacena un soporte, la funcin is_null() devolver false.
Mtodo alquila($soporte)
function alquila($soporte){
if ($this->tiene_alquilado($soporte)){
echo "<p>El cliente ya tiene alquilado el soporte <b>" . $soporte->titulo . "</b>";
}elseif ($this->num_soportes_alquilados==$this->max_alquiler_concurrente){
echo "<p>Este cliente tiene " . $this->num_soportes_alquilados . " elementos alquilados.
";
echo "No puede alquilar ms en este videoclub hasta que no devuelva algo";
}else{
//miro en el array a ver donde tengo sitio para meter el soporte
$cont = 0;
while (!is_null($this->soportes_alquilados[$cont])){
46

$cont++;
}
$this->soportes_alquilados[$cont]=$soporte;
$this->num_soportes_alquilados++;
echo "<p><b>Alquilado soporte a: </b>" . $this->nombre . "<br>";
$soporte->imprime_caracteristicas();
}

Este mtodo sirve para alquilar una pelcula o juego por parte del cliente. Recibe el soporte
a alquilar y, en caso que el alquiler se pueda producir, debe introducir el objeto soporte
recibido en el array de soportes alquilados del cliente.
Lo primero que hace es comprobar que el cliente no tiene alquilado ese mismo soporte,
utilizando el mtodo tiene_alquilado() de la clase soporte. Si no lo tiene alquilado
comprueba que todava tiene capacidad para alquilar otro soporte, es decir, que no ha
llegado al mximo en el nmero de soportes alquilados.
Si se puede alquilar el soporte, lo introduce dentro del array soportes_alquilados en una
posicin vaca (una casilla donde antes hubiera un null), incrementa en uno el nmero de
soportes alquilados e imprime las caractersticas del soporte que se ha alquilado.
Mtodo devuelve($identificador_soporte)
function devuelve($identificador_soporte){
if ($this->num_soportes_alquilados==0){
echo "<p>Este cliente no tiene alquilado ningn elemento";
return false;
}
//recorro el array a ver si encuentro el soporte con identificador recibido
for ($i=0;$i<$this->max_alquiler_concurrente;$i++){
if (!is_null($this->soportes_alquilados[$i])){
if ($this->soportes_alquilados[$i]->dame_numero_identificacion() ==
$identificador_soporte){
echo "<p>Soporte devuelto: " . $identificador_soporte;
echo " <b>" . $this->soportes_alquilados[$i]->titulo . "</b>";
$this->soportes_alquilados[$i]=null;
$this->num_soportes_alquilados--;
return true;
}
}
}
//si estoy aqui es que el cliente no tiene ese soporte alquilado
echo "<p>No se ha podido encontrar el soporte en los alquileres de este cliente";
return false;
}

47

El mtodo devuelve recibe el identificador del soporte que debe devolver el cliente.
Devuelve true si se consigui devolver el soporte, false en caso contrario. Lo primero que
hace es comprobar si el cliente tiene alquilado algn soporte, comprobando que la variable
num_soportes_alquilados no sea cero.
Luego hace un recorrido por el array de soportes alquilados para ver si encuentra el soporte
que se desea devolver. Para cada soporte alquilado (cada casilla del array que no contenga
el valor null) comprueba si el identificador es el mismo que el recibido por parmetro.
Cuando encuentra el soporte, muestra un mensaje por pantalla y lo devuelve simplemente
poniendo a null la casilla correspondiente del array soportes_alquilados y decrementando
en uno el atributo num_soportes_alquilados.
Si se encuentra el soporte, se sale de la funcin devolviendo true. Por lo que, si no se ha
salido de la funcin despus de hacer el recorrido por el array, sabemos que no se ha
encontrado ese soporte. Entonces mostramos un mensaje en pantalla y devolvemos false.
Mtodo lista_alquileres()
function lista_alquileres(){
if ($this->num_soportes_alquilados==0){
echo "<p>Este cliente no tiene alquilado ningn elemento";
}else{
echo "<p><b>El cliente tiene " . $this->num_soportes_alquilados . " soportes
alquilados</b>";
//recorro el array para listar los elementos que tiene alquilados
for ($i=0;$i<$this->max_alquiler_concurrente;$i++){
if (!is_null($this->soportes_alquilados[$i])){
echo "<p>";
$this->soportes_alquilados[$i]->imprime_caracteristicas();
}
}
}
}
Este mtodo hace un recorrido por el array de soportes alquilados y muestra las
caractersticas de cada soporte. Comprueba que el cliente tiene algo alquilado antes de
hacer el recorrido.
Recordar siempre, antes de llamar a un mtodo del soporte almacenado en cada casilla del
array, comprobar que el contenido de esa casilla no es null.
Mtodo imprime_caracteristicas()
function imprime_caracteristicas(){
echo "<p><b>Cliente " . $this->numero . ":</b> " . $this->nombre;
echo "<br>Alquileres actuales: " . $this->num_soportes_alquilados
}
48

Simplemente muestra algunos de los datos del cliente. Es un mtodo para obtener algn
dato por pantalla de un cliente.
Comprobar el funcionamiento de la clase cliente
Es importante sealar que, para que la clase cliente funcione, debe disponer de los cdigos
de las distintas clases de las que hace uso (la clase soporte, cinta_video, juego y dvd). Estos
cdigos se pueden haber escrito en el mismo archivo o bien incluirse con unas instrucciones
como estas:
include "soporte.php";
include "dvd.php";
include "juego.php";
include "cinta_video.php";
La clase cliente se puede poner en funcionamiento, para probar su correcta implementacin,
con un cdigo como este:
//instanciamos un par de objetos cliente
$cliente1 = new cliente("Pepe", 1);
$cliente2 = new cliente("Roberto", 564);
//mostramos el numero de cada cliente creado
echo "El identificador del cliente 1 es: " . $cliente1->dame_numero();
echo "<br>El identificador del cliente 2 es: " . $cliente2->dame_numero();
//instancio algunos soportes
$soporte1 = new cinta_video("Los Otros", 1, 3.5, "115 minutos");
$soporte2 = new juego("Final Fantasy", 2, 2.5, "Playstation",1,1);
$soporte3 = new dvd("Los Intocables", 3, 3, "Ingls y espaol","16:9");
$soporte4 = new dvd("El Imperio Contraataca", 4, 3, "Ingls y espaol","16:9");
//alquilo algunos soportes
$cliente1->alquila($soporte1);
$cliente1->alquila($soporte2);
$cliente1->alquila($soporte3);
//voy a intentar alquilar de nuevo un soporte que ya tiene alquilado
$cliente1->alquila($soporte1);
//el cliente tiene 3 soportes en alquiler como mximo
//este soporte no lo va a poder alquilar
$cliente1->alquila($soporte4);
//este soporte no lo tiene alquilado
$cliente1->devuelve(4);
49

//devuelvo un soporte que s que tiene alquilado


$cliente1->devuelve(2);
//alquilo otro soporte
$cliente1->alquila($soporte4);
//listo los elementos alquilados
$cliente1->lista_alquileres();
La ejecucin de este cdigo, si todo funciona correctamente, debera devolvernos
como resultado esta salida:
El identificador del cliente 1 es: 1
El identificador del cliente 2 es: 564
Alquilado soporte a: Pepe
Pelcula en VHS:
Los Otros
3.5 (IVA no incluido)
Duracin: 115 minutos
Alquilado soporte a: Pepe
Juego para: Playstation
Final Fantasy
2.5 (IVA no incluido)
Para un jugador
Alquilado soporte a: Pepe
Pelcula en DVD:
Los Intocables
3 (IVA no incluido)
Ingls y espaol
El cliente ya tiene alquilado el soporte Los Otros
Este cliente tiene 3 elementos alquilados. No puede alquilar ms en este videoclub hasta
que no devuelva algo
No se ha podido encontrar el soporte en los alquileres de este cliente
Soporte devuelto: 2 Final Fantasy
Alquilado soporte a: Pepe
Pelcula en DVD:
El Imperio Contraataca
3 (IVA no incluido)
Ingls y espaol
El cliente tiene 3 soportes alquilados
50

Pelcula en VHS:
Los Otros
3.5 (IVA no incluido)
Duracin: 115 minutos
Pelcula en DVD:
El Imperio Contraataca
3 (IVA no incluido)
Ingls y espaol
Pelcula en DVD:
Los Intocables
3 (IVA no incluido)
Ingls y espaol

2.4.11 Repaso de PPO en PHP5


Para afianzar los conocimientos sobre programacin orientada a objetos vamos a
concluir por ahora la creacin de nuestro videoclub con PHP5.
Para continuar la creacin del videoclub y las explicaciones sobre la programacin
orientada a objetos (POO), vamos a programar la clase principal, que engloba a todas las
clases que hemos ido creando hasta el momento. La clase principal se llama videoclub y
modela el comportamiento general del videoclub.
Llegado este punto sera bueno que remarcar dos cosas sobre el desarrollo de programas
orientados a objetos.
1. La clase principal de un sistema que deseamos modelar en POO se suele llamar
como el propio sistema que estamos modelando. Por ejemplo, si estuviramos
creando una biblioteca, la clase principal se llamara biblioteca. En este caso, que
estamos haciendo un videoclub, la clase principal se llamar videoclub.
2. El proceso de creacin de un programa POO se realiza al revs de como hemos
hecho en este manual, empezando el desarrollo de la clase general y finalizando por
las clases ms especficas. De este modo, al crear la clase general, podemos ir
viendo qu otros objetos necesitaremos, cules sern sus mtodos y propiedades. En
este manual lo hemos hecho al revs porque nos vena bien para ir describiendo las
caractersticas de la POO.

51

La clase videoclub tendr como propiedades a los soportes en alquiler (pelculas o juegos) y
por otra parte, los socios o clientes que alquilan los productos. Los mtodos de la clase
videoclub sern la inclusin y listado de soportes en alquiler y de socios, el alquiler de
soportes por parte de clientes.
Nota:Ni que decir tiene que el videoclub que estamos creando est simplificado al
mximo. Est claro que si estuvisemos creando un videoclub con el propsito de
utilizarlo en produccin, habra que pensar y desarrollar muchas otras
funcionalidades.
Vamos ya con el cdigo y sus explicaciones.
Atributos de la clase videoclub
public $nombre;
private $productos;
private $num_productos;
private $socios;
private $num_socios;
El atributo $productos ser un array con los distintos soportes en alquiler. $num_productos
lo utilizaremos para llevar la cuenta del nmero de productos que tenemos disponibles. De
modo similar, $socios ser un array de clientes y $num_socios llevar la cuenta de los
socios que tenemos dados de alta. Aparte, nuestro videoclub tendr un nombre, que
almacenaremos en la variable $nombre.
Constructor
function __construct($nombre){
$this->nombre=$nombre;
$this->productos=array();
$this->num_productos=0;
$this->socios=array();
$this->num_socios=0;
}
Este mtodo inicializar los atributos del objeto que se est construyendo. Recibe
nicamente el nombre del videoclub. Como tareas destacables estn las inicializaciones de
los arrays de productos y socios y la puesta a cero de los contadores que vamos a utilizar.
Mtodo incluir_producto()
private function incluir_producto($nuevo_producto){
$this->productos[$this->num_productos]=$nuevo_producto;
echo "<p>Incluido soporte " . $this->num_productos;
$this->num_productos++;

52

}
Este mtodo ha sido declarado como private, porque slo queremos que se llame desde
dentro de la clase. Recibe el nuevo producto que se quiere dar de alta y lo guardar en el
array de productos, en la posicin marcada por el atributo num_productos. Luego muestra
un mensaje por pantalla y por ltimo incrementa a uno el atributo num_productos.
Mtodos incluir_dvd(),incluir_cinta_video() e incluir_juego()
Los tres siguientes mtodos que vamos a ver, instancian los tres productos con los que
trabaja el videoclub y luego los introducen en array de productos llamando a
incluir_producto().
function incluir_dvd($tit,$precio,$idiomas,$pantalla){
$dvd_nuevo = new dvd($tit, $this->num_productos, $precio, $idiomas, $pantalla);
$this->incluir_producto($dvd_nuevo);
}
function incluir_cinta_video($tit,$precio,$duracion){
$cinta_video_nueva = new cinta_video($tit, $this->num_productos, $precio, $duracion);
$this->incluir_producto($cinta_video_nueva);
}
function incluir_juego($tit,$precio,$consola,$min_j,$max_j){
$juego_nuevo = new juego($tit, $this->num_productos, $precio, $consola, $min_j,
$max_j);
$this->incluir_producto($juego_nuevo);
}
Podemos fijarnos que el nmero de identificacin del soporte, que recibe el constructor de
las cintas de vdeo, DVDs o juegos, lo generamos por medio del atributo de la clase de
videclub num_productos, que guarda el nmero de productos dados de alta.
Mtodo incluir_socio()
Este mtodo hace las tareas de instanciacin del socio nuevo y su inclusin en el array de
socios.
function incluir_socio($nombre,$max_alquiler_concurrente=3){
$socio_nuevo = new cliente($nombre,$this->num_socios,$max_alquiler_concurrente);
$this->socios[$this->num_socios]=$socio_nuevo;
echo "<p>Incluido socio " . $this->num_socios;
$this->num_socios++;
}
Reciben los datos del nuevo socio: nombre y el mximo nmero de pelculas que puede
alquilar (siendo 3 el valor por defecto). Una vez instanciado el nuevo socio, lo introduce en
53

el array, en la posicin marcada por el atributo num_socios. Luego muestran un mensaje


por pantalla y por ltimo incrementan a uno los atributos num_productos o num_socios.
El nmero de socio, que recibe entre otros parmetros, el constructor de la clase socio lo
generamos por medio del contador de socios num_socios, de la clase videclub.
Mtodos listar_productos() y listar_socios()
Dos mtodos muy similares, que veremos de una sola vez.
function listar_productos(){
echo "<p>Listado de los " . $this->num_productos . " productos disponibles:";
for ($i=0;$i<$this->num_productos;$i++){
echo "<p>";
$this->productos[$i]->imprime_caracteristicas();
}
}
function listar_socios(){
echo "<p>Listado de $this->num_socios socios del videoclub:";
for ($i=0;$i<$this->num_socios;$i++){
echo "<p>";
$this->socios[$i]->imprime_caracteristicas();
}
}
Estos mtodos imprimen un listado completo de los socios y productos dados de alta.
Simplemente hacen un recorrido del array de productos o de socios y van imprimiendo sus
caractersticas.
Mtodo alquila_a_socio()
Realiza las acciones necesarias para alquiler un producto a un socio.
function alquila_a_socio($numero_socio,$numero_producto){
if (is_null($this->socios[$numero_socio])){
echo "<p>No existe ese socio";
}elseif(is_null($this->productos[$numero_producto])){
echo "<p>No existe ese soporte";
}else{
$this->socios[$numero_socio]->alquila($this->productos[$numero_producto]);
}
}
Este mtodo recibe el identificador del socio y del producto en alquiler. Antes de proceder,
realiza un par de comprobaciones. La primera para ver si existe un socio con el nmero de
socio indicado por parmetro y la segunda para ver si tambin existe un producto con el
54

nmero de producto dado.


Si todo fue bien, llama al mtodo alquila() del socio, envindole el producto que desea
alquilar.
Nota:El mtodo alquila() del socio tiene cierta complejidad, pero ya la vimos
cuando explicamos la clase socio. En este momento, por el principio de
encapsulacin de la POO, debemos abstraernos de su dificultad y no prestarle
atencin porque sabemos que funciona y no nos debe preocupar cmo lo hace.
Para probar la clase videoclub podramos utilizar un cdigo como este:
$vc = new videoclub("La Eliana Video");
//voy a incluir unos cuantos soportes de prueba
$vc->incluir_juego("Final Fantasy", 2.5, "Playstation",1,1);
$vc->incluir_juego("GP Motoracer", 3, "Playstation II",1,2);
$vc->incluir_dvd("Los Otros", 4.5, "Ingls y espaol","16:9");
$vc->incluir_dvd("Ciudad de Dis", 3, "Portugus, ingls y espaol","16:9");
$vc->incluir_dvd("Los Picapiedra", 3, "Espaol","16:9");
$vc->incluir_cinta_video("Los Otros", 4.5, "115 minutos");
$vc->incluir_cinta_video("El nombre de la Rosa", 1.5, "140 minutos");
//listo los productos
$vc->listar_productos();
//voy a crear algunos socios
$vc->incluir_socio("Jos Fuentes");
$vc->incluir_socio("Pedro Garca",2);
$vc->alquila_a_socio(1,2);
$vc->alquila_a_socio(1,3);
//alquilo otra vez el soporte 2 al socio 1.
// no debe dejarme porque ya lo tiene alquilado
$vc->alquila_a_socio(1,2);
//alquilo el soporte 6 al socio 1.
//no se puede porque el socio 1 tiene 2 alquileres como mximo
$vc->alquila_a_socio(1,6);
//listo los socios
$vc->listar_socios();
Se hace una carga de datos y una llamada a todos los mtodos que hemos visto para el
videoclub. Este cdigo dar como resultado una salida como la siguiente:
Incluido soporte 0

55

Incluido soporte 1
Incluido soporte 2
Incluido soporte 3
Incluido soporte 4
Incluido soporte 5
Incluido soporte 6
Listado de los 7 productos disponibles:
Juego para: Playstation
Final Fantasy
2.5 (IVA no incluido)
Para un jugador
Juego para: Playstation II
GP Motoracer
3 (IVA no incluido)
De 1 a 2 Jugadores.
Pelcula en DVD:
Los Otros
4.5 (IVA no incluido)
Ingls y espaol
Pelcula en DVD:
Ciudad de Dis
3 (IVA no incluido)
Portugus, ingls y espaol
Pelcula en DVD:
Los Picapiedra
3 (IVA no incluido)
Espaol
Pelcula en VHS:
Los Otros
4.5 (IVA no incluido)
Duracin: 115 minutos
Pelcula en VHS:
El nombre de la Rosa
1.5 (IVA no incluido)
56

Duracin: 140 minutos


Incluido socio 0
Incluido socio 1
Alquilado soporte a: Pedro Garca
Pelcula en DVD:
Los Otros
4.5 (IVA no incluido)
Ingls y espaol
Alquilado soporte a: Pedro Garca
Pelcula en DVD:
Ciudad de Dis
3 (IVA no incluido)
Portugus, ingls y espaol
El cliente ya tiene alquilado el soporte Los Otros
Este cliente tiene 2 elementos alquilados. No puede alquilar ms en este videoclub hasta
que no devuelva algo
Listado de 2 socios del videoclub:
Cliente 0: Jos Fuentes
Alquileres actuales: 0
Cliente 1: Pedro Garca
Alquileres actuales: 2
Hasta aqu ha llegado por ahora el desarrollo de este videoclub, que no es muy funcional
pero esperamos que haya servido para empezar a conocer las caractersticas de la
programacin orientada a objetos.
En adelante, seguiremos este manual comentando otras particularidades de la POO en PHP
5, que tambin hay que conocer.
Conoceremos lo que es una clase abstracta y los mtodos abstractos. Cmo se definen
y en qu situaciones se deben utilizar.
Una clase abstracta es la que tiene mtodos abstractos. Los mtodos abstractos son los que
estn declarados en una clase, pero no se ha definido en la clase el cdigo de esos mtodos.
Esa puede ser una buena definicin de clases y mtodos abstractos, pero veamos con calma
una explicacin un poco ms detallada y comprensible por todos.
57

En ocasiones, en un sistema de herencia como el de la programacin orientada a objetos


(POO), tenemos entidades que declarar aunque no se puede dar su definicin todava,
simplemente las deseamos definir por encima para empezar una jerarqua de clases.
Pensemos en los productos lcteos (los derivados de la leche). No cabe duda que los
productos lcteos son una gran familia. Incluyen a los yogures, mantequillas, quesos,
helados e incluso a la propia leche. Sin embargo, los productos lcteos en si no se
encuentran en la vida real. En el supermercado no te venden un producto lcteo en general.
Por ejemplo, nadie compra un kilo de producto lcteo... ms bien preguntarn por un litro
de leche, un litro de helado o un pack de yogures.
Todos los productos lcteos tienen algunas caractersticas comunes, como el porcentaje en
leche o la fecha de caducidad. Tambin tienen algunas funcionalidades comunes como
conservarse o consumirse. Sin embargo, la manera de conservarse es distinta dependiendo
del producto lcteo. La leche se conserva fuera de la nevera, mientras que no est abierto el
brick, y los yogures deben conservarse en la nevera en todo momento. Los quesos se
conservan en la nevera, pero metidos dentro de un recipiente por si acaso desprenden olores
fuertes. Por lo que respecta a los helados, se deben conservar en el congelador, siempre que
deseemos que no se conviertan en lquido. Al consumir un producto lcteo la cosa tambin
cambia, puesto que el queso se suele acompaar con pan o tostadas, la leche se bebe y el
helado se toma con cuchara.
En definitiva, a donde queremos demostrar es que podemos tener un conjunto de objetos
que tienen unas caractersticas comunes y funcionalidades, tambin comunes, pero que
difieren en la manera de llevarlas a cabo. Para esto est la abstraccin.
La clase de los productos lcteos, tendr una serie de propiedades y unos mtodos
abstractos. Los mtodos abstractos, como habamos adelantado, son aquellos que no
incluyen una codificacin, sino que simplemente se declaran, dejando para las clases que
hereden la tarea de codificarlos.
En este caso, la clase producto lcteo tendr los mtodos abstractos conservarse() y
consumirse(), pero no se especificar el cdigo fuente de estos mtodos (por eso son
abstractos). Las clases que hereden de producto lcteo sern las encargadas de definir un
cdigo para los mtodos definidos como abstractos en la clase padre. As, cada clase que
herede de producto lcteo, deber especificar el mecanismo concreto y especfico por el
cual se van a conservar o consumir.
Las clases que incorporan mtodos abstractos se deben declarar como abstractas. Es una
condicin forzosa. Las clases abstractas no se pueden instanciar. Es decir, no podemos
crear objetos a partir de ellas. Es algo lgico. Pensemos en los productos lcteos, estos no
existen ms que como una idea general. Slo podremos encontrar productos lcteos de un
tipo en concreto, como leche o yogur, pero no la idea de producto lcteo en general.
Una clase que herede de un producto lcteo debe definir los mtodos abstractos declarados
en la clase abstracta. De lo contrario, la clase que hereda estara obligada a declararse como
58

abstracta.
En nuestro ejemplo de videoclub, tratado a lo largo de los distintos captulos del manual de
PHP 5, tenemos una clase que tambin sera un buen ejemplo de clase abstracta. Se trata de
la clase soporte. De esta clase heredaban los distintos productos del videoclub, como
pelculas en DVD, cintas de vdeo o juegos. No hubiera sido mala idea declarar como
abstracta la clase soporte, dado que no se van a utilizar, ni existen, soportes en general, sino
que lo que existen son los distintos soportes concretos.
La sintaxis de la abstraccin
Para declarar clases y mtodos abstractos se utiliza la siguiente sintaxis.
abstract class nombre_clase{
//propiedades
public x;
private y;
//mtodos
public function __construct(){

}
public abstract function nombre_metodo();
}
Nos fijamos que se utiliza la palabra clave "abstract" para definir las clases o mtodos
abstractos. Adems, los mtodos abstractos no llevan ningn cdigo asociado, ni siquiera
las llaves para abrir y cerrar el mtodo.
Vemos lo que son las interfaces, para qu se utilizan y cmo trabajar con ellas en
PHP5.
Las interfaces son un sistema bastante comn, utilizado en programacin orientada a
objetos. Son algo as como declaraciones de funcionalidades que tienen que cubrir las
clases que implementan las interfaces.
En una interfaz se definen habitualmente un juego de funciones que deben codificar las
clases que implementan dicha interfaz. De modo que, cuando una clase implementa una
interfaz, podremos estar seguros que en su cdigo estn definidas las funciones que inclua
esa interfaz.

59

A la hora de programar un sistema, podemos contar con objetos que son muy diferentes y
que por tanto no pertenecen a la misma jerarqua de herencia, pero que deben realizar
algunas acciones comunes. Por ejemplo, todos los objetos con los que comercia unos
grandes almacenes deben contar con la funcionalidad de venderse. Una mesa tiene poco en
comn con un calefactor o unas zapatillas, pero todos los productos disponibles deben
implementar una funcin para poder venderse.
Otro ejemplo. Una bombilla, un coche y un ordenador son clases muy distintas que no
pertenecen al mismo sistema de herencia, pero todas pueden encenderse y apagarse. En este
caso, podramos construir una interfaz llamada "encendible", que incluira las
funcionalidades de encender y apagar. En este caso, la interfaz contendra dos funciones o
mtodos, uno encender() y otro apagar().
Cuando se define una interfaz, se declaran una serie de mtodos o funciones sin especificar
ningn cdigo fuente asociado. Luego, las clases que implementen esa interfaz sern las
encargadas de proporcionar un cdigo a los mtodos que contiene esa interfaz. Esto es
seguro: si una clase implementa una interfaz, debera declarar todos los mtodos de la
interfaz. Si no tenemos cdigo fuente para alguno de esos mtodos, por lo menos debemos
declararlos como abstractos y, por tanto, la clase tambin tendr que declararse como
abstracta, porque tiene mtodos abstractos.
Cdigo para definir una interfaz
Veamos el cdigo para realizar una interfaz. En concreto veremos el cdigo de la interfaz
encendible, que tienen que implementar todas las clases cuyos objetos se puedan encender
y apagar.
interface encendible{
public function encender();
public function apagar();
}
Vemos que para definir una interfaz se utiliza la palabra clave interface, seguida por el
nombre de la interfaz y, entre llaves, el listado de mtodos que tendr. Los mtodos no se
deben codificar, sino nicamente declararse.
Implementacin de interfaces
Ahora veamos el cdigo para implementar una interfaz en una clase.
class bombilla implements encendible{
public function encender(){
echo "<br>Y la luz se hizo...";
}
public function apagar(){

60

echo "<br>Estamos a oscuras...";

Para implementar una interfaz, en la declaracin de la clase, se debe utilizar la palabra


implements, seguida del nombre de la interfaz que se va a implementar. Se podran
implementar varias interfaces en la misma clase, en cuyo caso se indicaran todos los
nombres de las interfaces separadas por comas.
En el cdigo de la clase estamos obligados a declarar y codificar todos los mtodos de la
interfaz.
Nota: en concreto, PHP 5 entiende que si una clase implementa una interfaz, los
mtodos de esa interfaz estarn siempre en la clase, aunque no se declaren. De
modo que si no los declaramos explcitamente, PHP 5 lo har por nosotros. Esos
mtodos de la interfaz sern abstractos, as que la clase tendr que definirse como
abstracta. Se puede encontrar ms informacin sobre la abstraccin en el artculo
Mtodos y clases abstractos en PHP 5.
Ahora veamos el cdigo de la clase coche, que tambin implementa la interfaz encendible.
Este cdigo lo hemos complicado un poco ms.
class coche implements encendible{
private $gasolina;
private $bateria;
private $estado = "apagado";
function __construct(){
$this->gasolina = 0;
$this->bateria = 10;
}
public function encender(){
if ($this->estado == "apagado"){
if ($this->bateria > 0){
if ($this->gasolina > 0){
$this->estado = "encendido";
$this->bateria --;
echo "<br><b>Enciendo...</b> estoy encendido!";
}else{
echo "<br>No tengo gasolina";
}
}else{
echo "<br>No tengo batera";
}
}else{

61

echo "<br>Ya estaba encendido";

public function apagar(){


if ($this->estado == "encendido"){
$this->estado = "apagado";
echo "<br><b>Apago...</b> estoy apagado!";
}else{
echo "<br>Ya estaba apagado";
}
}

public function cargar_gasolina($litros){


$this->gasolina += $litros;
echo "<br>Cargados $litros litros";
}

A la vista del anterior cdigo, se puede comprobar que no hay mucho en comn entre las
clases bombilla y coche. El cdigo para encender una bombilla era muy simple, pero para
poner en marcha un coche tenemos que realizar otras tareas. Antes tenemos que ver si el
coche estaba encendido previamente, si tiene gasolina y si tiene batera. Por su parte, el
mtodo apagar hace una nica comprobacin para ver si estaba o no el coche apagado
previamente.
Tambin hemos incorporado un constructor que inicializa los atributos del objeto. Cuando
se construye un coche, la batera est llena, pero el depsito de gasolina est vaco. Para
llenar el depsito simplemente se debe utilizar el mtodo cargar_gasolina().
Llamadas polimrficas pasando objetos que implementan una interfaz
Las interfaces permiten el tratamiento de objetos sin necesidad de conocer las
caractersticas internas de ese objeto y sin importar de qu tipo son... simplemente tenemos
que saber que el objeto implementa una interfaz.
Por ejemplo, tanto los coches como las bombillas se pueden encender y apagar. As pues,
podemos llamar al mtodo encender() o apagar(), sin importarnos si es un coche o una
bombilla lo que hay que poner en marcha o detener.
En la declaracin de una funcin podemos especificar que el parmetro definido
implementa una interfaz, de modo que dentro de la funcin, se pueden realizar acciones
teniendo en cuenta que el parmetro recibido implementa un juego de funciones
determinado.

62

Por ejemplo, podramos definir una funcin que recibe algo por parmetro y lo enciende.
Especificaremos que ese algo que recibe debe de implementar la interfaz encendible, as
podremos llamar a sus mtodos enciende() o apaga() con la seguridad de saber que existen.
function enciende_algo (encendible $algo){
$algo->encender();
}
$mibombilla = new bombilla();
$micoche = new coche();
enciende_algo($mibombilla);
enciende_algo($micoche);
Si tuviramos una clase que no implementa la interfaz encendible, la llamada a esta funcin
provocara un error. Por ejemplo, un CD-Rom no se puede encender ni apagar.
class cd{
public $espacio;
}
$micd = new cd();
enciende_algo($micd); //da un error. cd no implementa la interfaz encendible
Esto nos dara un error como este: Fatal error: Argument 1 must implement interface
encendible in c:\www\ejphp5\funcion_encender.php on line 6. Queda muy claro que
deberamos implementar la interfaz encendible en la clase cd para que la llamada a la
funcin se ejecute correctamente.

2.5. Manejo de Formularios con PHP.

Ahora que ya hemos visto la sintaxis bsica del lenguaje, podemos analizar en ms
detalle la relacin entre HTML y PHP.
El mecanismo bsico de interaccin entre el usuario y nuestra aplicacin esta dado por
el uso de formularios HTML.
En un primer momento por medio de PHP,el servidor genera un formulario que el
navegador interpreta y lo muestra en pantalla para que el usuario pueda trabajar con el e
ingresar datos, luego los datos en el formulario viajan al servidor en el prximo
pedido(submit) realizado por el navegador para ser analizados e interpretados en el
mismo. La respuesta del server suele depender de los datos recibidos en el formulario.
El siguiente es un ejemplo de formulario en HTML sencillo, con solo un campo de tipo
63

"text" y un botn, que al presionarse enva el formulario.


<FORM ACTION="ejecutar.php" METHOD="POST">
<INPUT TYPE="text" name="nombre">
<INPUT TYPE="submit" name="enviar" value="enviar">
</FORM>

Tambin podemos decir que cuando se enva el formulario, los datos viajarn para ser
procesados por el script "ejecutar.php" por medio del mtodo "post" del protocolo
HTTP.
Luego, en el script ejecutar.php los datos del formulario se reciben en variables php que
tienen el mismo nombre que los indicados con "NAME" en el formulario, en este caso
el script recibe $nombre con el texto tipeado por el usuario en el formulario y tambin
$enviar con el valor "enviar" (por el botn).
Archivo: ejecutar.php
<?

?>

print ("Tu nombre es: $nombre <BR />");

2.5.1. Breve repaso de los tipos de campos de entrada


de formularios HTML.
2.5.1.1. Tipo: Text (texto)
Para ingresar texto mediante un formulario html se usa el tag input con atributo
type="text", otros atributos disponibles son:
Atributos:
- maxlength="numero" Cantidad mxima de caracteres que se pueden ingresar
- name="text" Nombre de la variable php que recibir el valor
- size="numero" Tamao del campo de entrada a mostrar en pantalla
- value="texto" Valor inicial a mostrar en el campo de entrada (default)

2.5.1.2. Tipo:Hidden (oculto)


El tag input con type="hidden" funciona en forma idntica a un tipo "text" con
diferencia que no se muestra en pantalla ni se le permite al usuario modificarlo, esto es
til para pasar variables entre formularios o guardar variables "ocultas" para que el
usuario no se percate de ellas.

2.5.1.3. Tipo Checkbox:

Los checkboxes son campos de entrada que soportan solamente los estados de
prendidos o no. Para ello se usa el tag input con type="checkbox" , los atributos
64

disponibles son:
Atributos:
- Checked Si el atributo esta presente el checkbox aparecer marcado por defecto.
name="text" Nombre de la variable php que recibe el valor.
value="text" Valor que toma la variable si esta seteada, el default es "on"
El script que recibe los resultados slo recibe los nombres de los checkboxes que estn
prendidos, es comn en php generar una lista de checkboxes a partir de un vector,
veamos un ejemplo:
Archivo:form2.php

<FORM ACTION="form2.php" METHOD="post">


<?PHP
$vector=array("opcion1","opcion2","opcion3");
for ($i=0;$i<count($vector);$i++) {
print("$vector[$i]");
?>
<input type="hidden" name='
valor[<?PHP print($i);?>]'
value='
<?PHP print("$vector[$i]");?>'
>
<input type="checkbox" name='
vector[<?PHP print($i);?>]'
> <br>
<?PHP
}?>
<INPUT TYPE="submit" name="proc">
</FORM>

Este es un ejemplo muy til en el cual el formulario html no es siempre el mismo sino
que es generado dinmicamente desde php en base a por ejemplo el contenido de un
vector.
Y el cdigo html que recibe el browser para mostrar el formulario (que se genera en el
servidor) es:
<FORM ACTION="form2.php" METHOD="post">

65

opcion1 <input type="hidden" name="valor[0]" value="opcion1">


<input type="checkbox" name="vector[0]"> <br>
opcion2 <input type="hidden" name="valor[1]" value="opcion2">
<input type="checkbox" name="vector[1]"> <br>
opcion3 <input type="hidden" name="valor[2]" value="opcion3">
<input type="checkbox" name="vector[2]"> <br>
<INPUT TYPE="submit" name="proc">
</FORM>

2.5.1.4. Tipo Radio Buttons(opcin mltiple):

Un radio button tambin es un tipo de botn de 2 estados (encendido-apagado) pero


estos pueden agruparse de forma tal que slo un radio-button del grupo pueda estar
prendido. El nombre de radio button fue puesto por su funcionamiento parecido a los
botones de las viejas radios de automviles, que siempre deba estar presionado uno de
los botones y nunca podan estar dos presionados al mismo tiempo.
28
Captulo 2. El lenguaje PHP
Los atributos son checked, name y value. Todos los radio buttons del mismo nombre
pertenecen al mismo grupo, es decir que de todo el grupo slo uno podr ser
seleccionado. El value del botn determina cual es el radio elegido del grupo. Ejemplo:
<?PHP
if(isset($proc)) {
print("El radio seteado es $grupo <BR />");
}
?>
<FORM ACTION="form3.php" METHOD="post">
<input type="radio" name="grupo" value="uno" checked>Uno<br>
<input type="radio" name="grupo" value="dos">Dos<br>
<INPUT TYPE="submit" name="Enviar">
</FORM>

66

2.5.1.5. Tipo TextArea:


Un textarea permite ingresar texto en una caja de formato mayor a un input type="text"
, la notacin de un textarea es distinta a la de un tag de input. Los atributos son los
siguientes:
cols="numero" Nmero de columnas del textarea
rows="numero" Nmero de lneas
name="texto" Nombre de la variable que recibe el texto
wrap="off/virtual/physical" Forma en la cual se cortan las palabras cuando termina
cada lnea, off elimina el corte de palabras, virtual muestra los cortes pero estos no son
transmitidos al server, physical corta las palabras y adems transmite los saltos de lnea
al servidor.
Ejemplo:

<textarea name="texto" cols="20" rows="10">


</textarea>

67

Entre el tag que abre y cierra si se desea se puede poner texto que se muestra en el
textarea y el usuario puede modificar.

2.5.1.6. Tipo Select (lista desplegable)


Un tipo muy interesante es el de lista "select" que permite hacer seleccin de uno o
varios elementos dentro de un conjunto (se pueden elejir muchos si el atributo multiple
esta agregado).
Para definir una lista se usa la tag "select" que anida la cantidad de tags "option" como
sea necesario:
Ejemplo:

<select name="curso" multiple>


<option value="1">primer curso</option>
<option value="2">segundo curso</option>
<option value="3">tercer curso</option>
</select>

68

La marca "option" tiene un atributo value, que en este ejemplo provocar que $curso
sea igual a el valor del mismo si se selecciona esa opcin.

2.5.1.7. File Uploads

El ltimo tipo de dato que se puede transferir al server usando un formulario es un


archivo, este es un tipo de transferencia especial pues implica generar un archivo en el
file-system del web-server a partir de un archivo que el usuario selecciona desde su
disco local.
HTML soporta el upload de archivos usando el tag <input> con type="file", este tipo de
input genera un boton "Browse" en el navegador que permite al usuario seleccionar un
archivo desde su disco rgido local.
El formulario para subir un archivo es de la forma:

<FORM ENCTYPE="multipart/form-data"
ACTION="subir_archivo.php" METHOD=POST>
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000">
Send this file: <INPUT NAME="archivo" TYPE="file">
<INPUT TYPE="submit" VALUE="Subir Archivo">
</FORM>

69

El script upload.php que recibe los datos del formulario recibe las siguientes variables:
- $userfile Path del archivo almacenado en el server.
- $userfile_name Nombre del archivo segn el usuario
- $userfile_size Tamao del archivo subido
- $userfile_type Mime type del archivo, por ejemplo image/gif
El script que recibe el archivo es responsable de hacer lo que corresponda con el mismo
ya que en general el archivo se almacena en un directorio temporal y es eliminado una
vez que termina el script. El script debe almacenar el archivo en una base de datos,
moverlo a un directorio permanente, tomar datos de el o realizar el procesamiento que
corresponda.

Captulo 3. Bases de Datos y SQL


(Structured Query Language)
3.1. Introduccin

Durante mucho tiempo, la informacin ha tenido un papel ms que relevante en la vida


de una organizacin, y ultimamente se la maneja y administra por medio de recursos
informticos. Una forma de realizar esto es por medio de una Base de Datos, usando
SQL. SQL es un lenguaje estructurado de consultas, que se usa para crear, mantener y
administrar Bases de Datos. La sintaxis del lenguaje es estndar y universal, por lo que
esta no vara en funcin al manejador de base de datos que estemos utilizando (MySql,
Oracle, PosgreSql, MsSQL server, etc...). A continuacin veremos una introduccin a
la teora del diseo, creacin y administracin de Base de Datos relacionales, por
medio de SQL.

70

3.1.1. Que es una Base de Datos (BD)?

Las bases de datos se basan en tablas, donde estas son objetos en los que se almacenan
los datos. Una tabla no es ms que una serie de registros (filas), cada uno de los cules
consta de diversos campos. Cada campo contiene un dato. Por tanto un registro es un
conjunto de datos que definen un elemento, que puede ser un cliente, un libro,etc. En
una tabla tendremos distintos elementos del mismo tipo, por ejemplo, varios clientes o
libros. Entonces decimos que la estructura de una tabla esta compuesta por filas
(registros) y columnas (atributos). Aqu tenemos un ejemplo de como es la estructura
de una tabla tpica:
# table "personas"
+------+------------+-------------+
| ID | Nombre | Apellido |
+------+------------+-------------+
| 1 | Linus | Torvalds |
| 2 | Julio | Cesar |
| 3 | Juan | Perez |
+------+------------+-------------+

Como se puede ver, la tabla divide la informacin en filas (registros), conformando


cada una, una persona distinta. Cada nueva entrada (persona) que se ingrese a la tabla
se ver como una nueva fila en esta. Las columnas, representan los atributos de los
registros, en nuestro ejemplo los registros tienen como atributos un identificador (ID) ,
un nombre y un apellido. Los campos de una tabla pueden contener distintos tipos de
datos, como ser nmeros, caracteres, fechas, etc.
Bases de Datos Relacionales:
Las Bases de Datos generalmente agrupan los datos en distintas tablas para as
mantener organizada la informacin y para que la misma no aparezca duplicada en la
BD. En este ltimo caso, las tablas se relacionan entre s para armar un esquema. Por
ejemplo podemos tener una tabla Empleado:
# table "empleado"
+--+------+---------+-------------+----+---------+-----------+------+
|Id|nombre| apellido| localidad | cp |tipo_empl| depto |sueldo|
+--+------+ --------+-------------+----+---------+-----------+------+
|1 |Linus | Torvalds| Bs.As. |1001| A | Ventas |500 |
|2 |Julio | Cesar | Santa Fe |3000| A | Ventas |500 |
|3 |Yino | Paez | Buenos Aires|1001| B | Produccin|1000 |
|3 |Jun | Perez | Buenos Aires|1001| B | Produccin|1000 |
|3 |Rubn | Atino | Sta. Fe |3000| B | Produccin|1000 |
|3 |Jun | Perez | Buenos Aires|1001| B | Produccin|1000 |
+--+------+---------+-------------+----+---------+-----------+------+

Como aqu vemos, tenemos toda la informacin de los empleados concentrada en una
sola tabla. A simple vista se puede ver como se duplica la informacin de las
localidades y del tipo de empleado. Tambin se ve como la misma informacin se
ingres con un formato distinto (por ejemplo "Buenos Aires" y "Bs.As.") haciendo de
71

esta manera que el manejador de la BD los tome como datos diferentes . Para
solucionar estos problemas se puede dividir la tabla en varias tablas. En nuestro
ejemplo podemos dividir la tabla "empleado" en tres tablas diferentes: "empleado" ,
"localidad" , "tipo_emp" La estructura de estas sera la siguiente:
# table "empleado"
+------+--------+------- --+--------+-----------+
| id | nombre | apellido | id_loc | tipo_empl |
+------+--------+----------+--------+--------- -+
| 1 | Linus | Torvalds | 1 | A |
| 2 | Julio | Cesar | 2 | A |
| 3 | Yino | Paez | 1 | B |
| 3 | Jun | Perez | 1 | B |
| 3 | Rubn | Atino | 2 | B |
| 3 | Jun | Perez | 1 | B |
+------+--------+----------+--------+-----------+
# table "localidad"
+---------+-----------------+-----+
| Id_loc | nombre | cp |
+---------+-----------------+-----+
| 1 | Buenos Aires |1001 |
| 2 | Santa Fe |3000 |
| 3 | Cordoba |5000 |
+---------+-----------------+-----+
# table "tipo_emp"
+-----------+------ -----+----------+
| tipo_empl | depto | sueldo |
+-----------+------------+----------+
| A | Ventas | 500 |
| B | Produccin | 1000 |
+-----------+------------+----------+

De esta manera centralizamos y organizamos la informacin para que no exista


redundancia en los datos y as se solucionaron los problemas anteriormente
mencionados. La relacin que existe entre tablas se da entre columnas (atributos), en
nuestro ejemplo la tabla empleado relaciona cada empleado con su respectiva localidad
por medio del atributo "id_loc", as por ejemplo si se quiere saber el nombre de la
localidad de Linus Torvalds, el campo correspondiente al atributo "id_loc" de este
registro nos indica que hace referencia al registro identificado por "1" en el atributo
"id_loc" de la tabla localidad, dndonos como resultado "Buenos Aires".

3.1.2. SQL(Structured Query Language)


Como mencionamos anteriormente SQL es un lenguaje estructurado de consultas, que
72

se usa para crear, mantener y administrar Bases de Datos. Existen dos tipos de
instrucciones SQL: las de definicin de objetos (DDL), y las de manejo de los datos
(DML). Una instruccin SQL puede estar compuesta por los siguientes elementos:
comandos, clusulas, operadores y funciones.
- Los comandos indican la operacin a realizar (ej: CREATE, INSERT, SELECT, etc).
- Las clusulas son parmetros de la instruccin SQL (ej: WHERE, GROUP BY,
ORDER BY, etc)
- Las funciones nos permiten modificar los resultados de una instruccin, no los datos
en s mismos (ej: MAX, MIN, COUNT, SUM,etc).
- Los operadores cumplen la funcin de restringir los registros involucrados en la
consulta (ej: AND, OR, NOT, <, =, etc)

3.1.2.1. Comandos

3.1.2.1.1. Los Comandos DDL [ CREATE , ALTER , DROP ]


3.1.2.1.1.1. Comando CREATE
Con este comando podemos crear Bases de Batos o bien tablas para las mismas. Para
crear bases de datos la sintaxis es: CREATE DATABASE nombre_BD; observar que
un comando sql siempre termina con un "punto y coma". Luego de crear una base de
datos tenemos que acceder a la misma mediante el comando USE nombre_BD; . Una
vez que accedemos a ella podemos crear tablas. El comando para crear una tabla es:
CREATE TABLE nombre_tabla ( nombre_atributo tipo , nombre_atributo tipo,
..., PRIMARY KEY (nombre_atributo) );
En esta consulta se puede poner la cantidad de atributos que se crean necesarios para la
tabla separados entre s por una coma, cada uno llevar un nombre y un tipo que puede
ser INT (entero), FLOAT (punto flotante), VARCHAR (caracteres), DATE (fecha),
BOOLEAN (booleano), entre otros. EL comando PRIMARY KEY define a un
atributo de la tabla como identificador nico de esta. Un identificador no puede nunca
repetirse dos veces en una tabla, ya que por medio de este se identifica a un registro en
particular. Ejemplo de CREATE
CREATE DATABASE empresa;
USE empresa;
CREATE TABLE empleado (id INT(5),
nombre VARCHAR(30),
apellido VARCHAR(50),
id_loc INT(3),
tipo_empl VARCHAR(1),
PRIMARY KEY (id) );

73

3.1.2.1.1.2. Comando DROP


Con este comando podemos eliminar Bases de Batos o bien una tabla de una BD. Para
eliminar una bases de datos la sintaxis es: DROP DATABASE nombre_BD; Al
eliminar una base de datos se eliminan tambin todas las tablas que esta contenga. Para
eliminar solo una tabla de la base de datos el comando es: DROP TABLE
nombre_tabla; Ejemplo de DROP
DROP DATABASE empresa;
DROP TABLE localidad;

3.1.2.1.1.3. Comando ALTER TABLE


Este comando se utiliza para modificar la estructura de una tabla en el caso de que
queramos agregar o quitar algn atributo de esta.
3.1.2.1.2. Los Comandos DML [ SELECT , INSERT , UPDATE y DELETE ]
3.1.2.1.2.1. Comando SELECT
Este comando se utiliza para realizar consultas a la base de datos, retornando una serie
de registros de las tablas que involucramos en la consulta. La sintaxis para realizar una
consulta es:
SELECT tabla.atributo AS nombre,...,tabla.atributo AS nombre
FROM tabla_1,...,tabla_n
WHERE condicin [AND/OR] relacin_entre_tablas;

Despus de la palabra clave SELECT le sigue una lista de los atributos de las distintas
tablas que queremos obtener con la consulta (se separan por comas). Si queremos
obtener todos los atributos se coloca " * ". Luego de la palabra clave AS (opcional) se
escribe el nombre con que se quiere que la consulta llame al atributo en cuestin. Luego
de la palabra clave FROM va una lista con los nombres de las tablas que intervienen en
la consulta, y finalmente, despus de la palabra clave WHERE se escriben todas las
condiciones que restringen a la consulta (separadas por AND o por OR) seguido de las
relaciones entre las tablas involucradas en la consulta (si es que corresponde) . Por
ejemplo si queremos obtener una lista con los nombres de los empleados del tipo "A"
junto con los nombres de sus respectivas localidades deberiamos poner:
SELECT empleado.nombre AS nombre_emp, localidad.nombre AS nombre_loc
FROM empleado, localidad
WHERE empleado.tipo_empl=A AND
empleado.id_loc=localidad.id_loc;

3.1.2.1.2.2. Comando INSERT


Este comando se utiliza para insertar un nuevo registro (fila) en una tabla de una
determinada Base de Datos. La sintaxis es la siguiente INSERT INTO nombre_tabla
VALUES (atrib_1,atrib_2,..,atrib_n); Luego de INSERT INTO escribimos el
nombre de la tabla a la que le vamos a agregar un registro, luego de la palabra clave
VALUES escribimos entre parntesis una lista con los valores para los distintos
atributos de la tabla. Se debe recordar que los valores de los atributos se colocan en el
mismo orden que aparecen en la tabla, sin saltearnos ninguno. En el caso de querer
74

dejar un atributo vaco, escribimos la palabra clave NULL en su respectiva posicin.


Por ejemplo:
INSERT INTO localidad VALUES (4, Recreo, NULL);

3.1.2.1.2.3. Comando UPDATE


Se usa para modificar uno o varios registros ya existentes de una determinada tabla La
sintaxis es la siguiente:
UPDATE nombre_tabla
SET atributo_1 = valor_1,..,
atributo_n = valor_n
WHERE condicin [AND/OR] condicin;

Luego de la palabra clave SET colocamos solo los nombres de los atributos que se
modificarn con sus nuevos valores, finalmente colocamos las condiciones para hacer
que las modificaciones se realicen solo sobre algunos registros. Por ejemplo:
UPDATE localidad SET cp = 3121 WHERE id_loc=4;

3.1.2.1.2.4. Comando DELETE


Se utiliza para eliminar uno o varios registros existentes de una tabla. Se debe tener en
cuenta el hecho que si se elimina un registro de una tabla puede hacer que la base de
datos pierda consistencia, ya que si un registro de otra tabla lo referenciaba, ahora lo
hara a un registro inexistente, originando graves inconvenientes. Por ejemplo si
eliminamos el registro correspondiente a la localidad de Santa Fe de la tabla localidad
deberiamos eliminar todos los registros de la tabla empleado que pertenezcan a la
localida de Santa Fe. La sentencia para un DELETE es la siguiente:
DELETE FROM nombre_tabla
WHERE condicin [AND/OR] condicion

Por ejemplo:

DELETE FROM localidad WHERE nombre="Santa Fe";


//para no perder consistencia
DELETE FROM empleado WHERE id_loc=2;
//la localidad 2 corresponde a Santa Fe.

3.1.2.2. Clusulas

3.1.2.2.1. GROUP BY
Esta clusula combina los registros con valores idnticos en la lista de campos
especificados, en un nico registro. Su sintaxis es:
SELECT campo_1,...,campo_n
FROM tabla_1,...,tabla_n
WHERE condicin
GROUP BY campos_del_grupo
HAVING condicin;

GROUP BY es opcional. Se utiliza la clusula WHERE para excluir aquellas filas que
75

no desea agrupar, y la clusula HAVING para filtrar los registros una vez agrupados.
Una vez que GROUP BY ha combinado los registros, se muestran los registros
agrupados que satisfagan las condiciones de la clusula HAVING.
3.1.2.2.2. ORDER BY
Se puede especificar el orden en que se desean obtener los registros de las tablas
mediante la clusula ORDER BY argumento al final del comando SELECT. Por
ejemplo:
SELECT cp, Nombre, FROM localidad ORDER BY cp;

Se pueden ordenar los registros por mas de un campo, como por ejemplo:
SELECT cp, Nombre, FROM localidad ORDER BY cp, nombre;

Incluso se puede especificar el orden de los registros: ascendente mediante la clusula


(ASC -se toma este valor por defecto) descendente (DESC)
SELECT cp, Nombre, FROM localidad ORDER BY cp DESC;

3.1.2.3. Funciones

3.1.2.3.1. AVG
Calcula la media aritmtica (promedio) de un conjunto de valores contenidos en un
campo especificado de una consulta. Su sintaxis es la siguiente Avg(expr)
En donde expr representa el campo que contiene los datos numricos para los que se
desea calcular la media. Por ejemplo
SELECT Avg(sueldo) AS Promedio FROM tipo_emp WHERE sueldo > 100;

3.1.2.3.2. COUNT
Calcula el nmero de registros devueltos por una consulta. Su sintaxis es la siguiente
Count(expr)

En donde expr contiene el nombre del campo que desea contar. Count simplemente
cuenta el nmero de registros sin tener en cuenta qu valores se almacenan en los
mismos. Si utiliza un asterisco como parmetro, se calcular el nmero total de
registros, incluyendo aquellos que contienen campos NULL.
SELECT Count(*) AS Total FROM empleado;

3.1.2.3.3. MAX , MIN


Devuelven el mnimo o el mximo de un conjunto de valores contenidos en un campo
especfico de una consulta. Su sintaxis es: Min(expr) Max(expr)
En donde expr es el campo sobre el que se desea realizar el clculo. Por ejemplo:
SELECT Min(Sueldo) AS ElMin FROM tipo_emp;
SELECT Max(Sueldo) AS ElMax FROM tipo_emp;

3.1.2.3.4. SUM
Devuelve la suma del conjunto de valores contenido en un campo especfico de una
consulta. Su sintaxis es: Sum(expr)
En donde expr respresenta el nombre del campo que contiene los datos que desean
76

sumarse. Por ejemplo:

SELECT Sum(Sueldo) AS Gasto FROM tipo_emp;

Captulo 4. Acceso a bases de datos


usando la librera AdoDB
4.1. Introduccin

Php es un lenguaje que permite el acceso a decenas de motores de bases de datos


diferentes, pero desafortunadamente, no cuenta con una interfaz estndar de acceso a
las mismas, por lo que si se tiene que cambiar el DBMS(gestor de bases de
datos),tambin se debera cambiar el cdigo del sistema que lo usa(Aunque las tablas
sean iguales).
Ejemplo: Funcin para hacer una consulta en mysql. $resultado=
mysql_query("select * from usuarios"); Para hacer la misma consulta en
Posgres SQL. $resultado= pg_query("select * from usuarios");
Esto tiene una explicacin totalmente razonable ya que no todas las bases de datos
soportan todas las funciones, ni todas tienen las mismas funcionalidades. Por lo que
muchas veces es necesario acceder a los DBMS con las funciones nativas.
En este curso se enseara a usar la librera AdoDb que bsicamente permite acceder
por funciones estndares a muchos DBMS, permitiendo el cambio y uso de distintas
bases de datos sin tener que cambiar cdigo fuente.
Esta librera esconde las diferencias que existen entre los distintos DBMS y permite
manejarlos por medio de SQL estndar.
Entre las bases de datos que soporta podemos mencionar:
MySQL
PosgreSQL
Interbase
Informix
Oracle
MS SQL 7
FoxPro
Access
DB2
Otros DBMS que soporten ODBC genrico

4.2. Inclusin de la librera en PHP

Para utilizar la librera AdoDb, se debe incluir el archivo adodb.inc.php que se viene
con la librera. Para esto se debe usar la sentencia include().
Ejemplo de inclusin de la librera Adodb

77

include(/path_donde_se_encuentra_adodb/adodb.inc.php);

4.3. Conexin a una base de datos

Cada vez que necesitamos conectarnos a un DBMS, se debe crear una nueva conexin
usando la funcin ADONewConnection($driver),donde la variable $driver es el tipo
de dbms a conectarse.
Ejemplo de creacin de una conexin a una base de datos mysql
include(/path_donde_se_encuentra_adodb/adodb.inc.php);
$conn = &ADONewConnection(mysql);

En este momento, todava no se esta conectado a la base de datos, para conectarse se


debe usar la funcin $conn->Connect() o $conn->PConnect().
Ejemplo de conexin a una base de datos mysql con el usuario Linus y la clave tux.
<?php

?<

include(adodb/adodb.inc.php);
$database="mysql";
$server="localhost";
$user="Linus";
$password="tux";
$db = &ADONewConnection($database);
$db->Connect($server, $user, $password, $database);

4.4. Ejecucin de una consulta simple

Para ejecutar una consulta SQL debe existir una conexin previa abierta y se debe usar
la funcin $conn->Execute($sql); que retorna un objeto tipo conjunto de registros.
Una vez ejecutada la consulta, se pueden acceder a cada fila retornada por medio del
mtodo $respuesta->MoveNext(); que avanza una fila.
Para acceder a cada columna de un registro accede al arreglo fields[] (campos) de
$respuesta. ej: $respuesta->fields[0];
Para ver si se ha llegado al fin del conjunto se utiliza el el atributo $respuesta->EOF
(que es verdadero si es el ltimo registro).
Ejemplo de consulta SQL
<?php

include(adodb.inc.php); // inclusin de la librera


$conn = &ADONewConnection(access); // crea la conexin tipo access
// se conecta a MS-Access

78

?>

$conn->PConnect(NTserver,linus,tux,dbempresa);
$resultado = &$conn->Execute(select * from clientes);
if (!$resultado)
print $conn->ErrorMsg();
else
while (!$resultado->EOF) {
print $resultado->fields[0].
.$resultado->fields[1].<BR>;
$resultado->MoveNext();
}
$resultado->Close(); // cierro el conjunto de registros
$conn->Close(); // cierro la conexin a la DB

Para que el arreglo $fields sea asociativo en vez de indexado (para no tener que
recordar la posicin de cierta columna en el arreglo) se debe modificar la propiedad de
la librera Ado llamada $ADODB_FETCH_MODE a ADODB_FETCH_ASSOC. Para retornar
a la indexacin por nmeros nuevamente se debe setear en ADODB_FETCH_NUM.
Ejemplo de arreglo asociativo e indexado.

$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$rs1 = $db->Execute(select * from usuario);
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$rs2 = $db->Execute(select * from usuario);
print $rs1->fields[1]; // la columna nombre esta en la posicin 1
print $rs2->fields[nombre]; //imprimo solo fields[nombre]

4.5. Sabiendo la cantidad de registros que


retorna una consulta

Para saber la cantidad de registros que retorna una consulta se debe usar el mtodo
$resultado->RecordCount().

Ejemplo de uso de RecordCount()


<?

include(adodb.inc.php); // inclusin de la librera


$conn = &ADONewConnection(oracle); // crea la conexin tipo oracle
// se conecta a oracle
$conn->PConnect(NTserver,linus,tux,dbempresa);
$resultado = &$conn->Execute(select * from clientes);
if (!$resultado)
print $conn->ErrorMsg();
else
while (!$resultado->EOF) {
print $resultado->fields[0].
.$resultado->fields[1].<BR>;

79

?>

$resultado->MoveNext();
}
print "La cantidad de Registros es "
.$resultado->RecordCount().;
$resultado->Close(); // cierro el conjunto de registros
$conn->Close(); // cierro la conexin a la DB

4.6. Insercin de registros usando AdoDB


Para insertar un registro se usa tambin la sentencia Execute()
Ejemplo simple de Insercin:

<?
include(adodb.inc.php); // inclusin de la librera
$conn = &ADONewConnection(db2); // crea la conexin tipo db2
// se conecta a db2
$conn->PConnect(Linuxserver,linus,tux,dbempresa);
$insersionSQL="insert into usuario (nombre,apellido) values
(Richard,Stallmann)";
if ($conn->Execute($insersionSQL) == false ) {
print no se pudo insertar: .$conn->ErrorMsg().<BR>;
}
$resultado->Close(); // cierro el conjunto de registros
$conn->Close(); // cierro la conexin a la DB
?>

4.7. Ejemplo de Insercin con generacin de


identificadores

Cuando queremos insertar un nuevo registro, por ejemplo una nueva localidad a una
tabla, muchas veces es necesario definir un identificador nico para esta,
desafortunadamente algunas bases de datos usan campos tipo auto incrementales y
otras usan el mtodo de secuencias.
La solucin que utiliza la librera AdoDb es secuencias y para las bases de datos que no
las soportan usa una emulacin de las mismas.
Ejemplo:

$id = $conexion->GenID(sequencia_tabla1);
$conexion->Execute("insert into tabla1 values ($id,BsAs,001)");

Para ejecutar consultas SQL de tipo Update o Delete tambin se utiliza el comando
Execute() y para saber la cantidad de registros afectados durante esa ejecucin se

80

utiliza la funcin Affected_Rows();


Ejemplo de un update con Affected_Rows()

<?
include(adodb.inc.php); // inclusin de la librera
$conn = &ADONewConnection(mysql);
// crea la conexin tipo mysql
// se conecta a mysql
$conn->PConnect(Linuxserver,linus,tux,dbempresa);
$updateSQL="update usuario set localidad=BsAs where grupo=2";
if ($conn->Execute($updateSQL) == false ) {
print no se pudo modificar: .$conn->ErrorMsg().<BR>;
}
print "La cantidad de registros modificados fue: "
.$conn->Affected_Rows();
$resultado->Close(); // cierro el conjunto de registros
$conn->Close(); // cierro la conexin a la DB
?>

4.8. Selects con limites de registros

Muchas veces se requiere una cantidad mxima de registros a retornar, por ejemplo los
10 primeros registros de una consulta. Tambin muchas veces se necesita una cantidad
de registros X empezando del registro Y (desplazamiento). Para esto existen clausulas
dentro de la consulta select que permiten hacerlo, desafortunadamente no estn
estandarizadas.
La solucin que implementa AdoDb es usar la funcin SelectLimit() en vez de la
funcin Execute().
La funcin SelectLimit toma 2 o tres parametros, el primer parametro es la consulta
SQL, el segundo parmetro es la cantidad de registros a retornar, y el ltimo
parmetro(opcional) es la cantidad de registros iniciales a ignorar.
Ejemplo de Select_Limit

<?
include(adodb.inc.php); // inclusin de la librera
$conn = &ADONewConnection(oracle); // crea la conexin tipo oracle
// se conecta a oracle
$conn->PConnect(NTserver,linus,tux,dbempresa);
$cantidad=10;
$inicio=2;
// selecciono 10 clientes y ignoro los 2 primeros
$resultado = &$conn->Select_Limit(
select * from clientes,$cantidad,$inicio);
if (!$resultado)
print $conn->ErrorMsg();
else
while (!$resultado->EOF) {
print $resultado->fields[0]. .$resultado->fields[1].<BR>;
$resultado->MoveNext();

81

}
$resultado->Close(); // cierro el conjunto de registros
$conn->Close(); // cierro la conexin a la DB
?>

4.9. Transacciones y AdoDB

Hay que pensar una base de datos como un recurso compartido entre muchos usuarios
que acceden simultaneamente a la misma, la leen, la modifican, y borran registros. Por
lo tanto hay que buscar una forma de asegurar que los datos queden consistentes
siempre. Para lograrlo se deben usar transacciones.
Su uso es fcil. Cuando se requiere agrupar consultas dentro de una transaccin estas
deben estar entre la funcin BeginTrans() y CommitTrans().
Si por alguna razn no se puede concretar la transaccin se debe llamar
RollbackTrans() que dejara todas las tablas como antes de comenzar la transaccin.

Advertencia

No todos los DBMS soportan transacciones.

Ejemplo de transaccin simple.

$DB->BeginTrans();
$DB->Execute("update table1 set val=$val1 where id=$id");
$DB->Execute("update table2 set val=$val2 where id=$id");
$DB->CommitTrans();

Ejemplo de transaccin con RollbackTrans()

$DB->BeginTrans();
$ok = $DB->Execute("update table1 set val=$val1 where id=$id");
if ($ok) $ok = $DB->Execute("update table2 set val=$val2 where id=$id");
if ($ok) $DB->CommitTrans();
else $DB->RollbackTrans();

Este es un documento explica las funciones bsicas de la librera AdoDb para mayor
informacin y actualizaciones, dirigirse a la pgina web de AdoDb.
50

Captulo 5. Introduccin al uso de


plantillas (Templates)
5.1. Introduccin

Como hemos visto anteriormente las sentencias del lenguaje Php pueden intercalarse
entre marcas html para producir una pgina dinmica, o sea que estamos mezclando la
parte esttica y dinmica de nuestro sistema en un solo archivo con extensin php.
82

Ahora veamos que pasara si por ejemplo, luego de escribir todo nuestro sistema, el
cliente no queda conforme con nuestro diseo o es necesario cambiarlo, para hacerlo
ms atractivo. Como nuestro diseo comparte los mismos archivos que la lgica, al
alterarlo, se podra cambiar el funcionamiento, o dejar en estado erroneo toda la
aplicacin. Por lo tanto estamos viendo una de las desventajas que trae la mezcla de
cdigo html y php en un mismo archivo. Estos problemas han sido estudiados
detenidamente durante mucho tiempo y se han encontrado muchas soluciones.
La solucin que veremos en nuestro curso se destaca por el uso de plantillas.

5.2. Que es una plantilla?

Una plantilla, no es ms que una pagina web esttica con marcas especiales. Estas
marcas nos permiten distinguir el lugar en donde irn los datos dinmicos para luego
reemplazar las marcas por los datos en tiempo de ejecucin.
Podemos decir que son archivos que definen la apariencia de una aplicacin web.
Si tenemos que cambiar la presentacin de nuestra aplicacin, slo se tiene que
modificar las plantillas sin necesidad de modificar el cdigo que le da funcionalidad a
la aplicacin.
Tambin permite separar el diseo de la lgica del programa y las puede realizar
cualquier persona con conocimientos de HTML. Esto adems de tener las ventajas ya
descritas, permite mejorar el tiempo en que se va a desarrollar la aplicacin, ya que los
diseadores pueden trabajar en las plantillas al mismo tiempo que los desarrolladores
en la lgica del sistema.
La forma en que se le puede dar la funcionalidad a php de plantillas es por medio de
libreras.
Una librera de plantillas mnimamente debera tener las siguientes funcionalidades:
1. Abrir el archivo de plantilla.
2. Reconocer donde se ubicaran los datos dinmicos (por medio de las marcas
especiales).
3. Reemplazar las marcas por los datos obtenidos (en general de una BD).
4. Imprimir la plantilla modificada.
Para la implementacin de plantillas existen varias libreras muy utilizadas:
(Template) PHPLib
FastTemplate
EasyTemplate
Para demostrar y explicar el uso de plantillas usaremos una librera mixta:
Combina la facilidad de EasyTemplate
Con la velocidad de FastTemplate
EasyTemplate
Por lo que usaremos la librera: EzFasttemplate

83

5.2.1. Ezfasttemplate

Una plantilla en Ezfasttemplate contiene:


Bloque/s de plantilla
Variables de plantilla
Cdigo html

5.2.1.1. Bloque de plantilla

Dentro de un bloque de plantilla, se permite ingresar datos dinmicos. Para identificar


inicio y fin de bloque se usa la siguiente sintaxis:
<!-- BEGIN nombrebloque -->
....
<!-- END nombrebloque -->

Un bloque puede ser repetitivo, para cuando la cantidad de datos a mostrar no es


constante. Este tipo se usa mucho para mostrar listados, resultados de consultas sql,etc.

5.2.1.2. Variables de Plantilla

Este tipo de variables se identifican mediante, su nombre encerrado entre llaves.


Ejemplo:

<!-- BEGIN bloque1 -->


Tu nombre es {nombre}
<!-- END bloque1 -->

Este ejemplo define una variable llamada nombre.


Las variables de plantilla solo pueden estar dentro de los bloques y pueden aparecer en
ellos mas de una vez.

5.2.1.3. Funciones de la librera

Funcin set_file(): Esta funcin permite la apertura de una plantilla y el anlisis de


la misma. Ej: set_file("plantilla","index.html");
Funcin set_var(): Esta funcin permite asignarle un valor a una variable de
plantilla. Ej: set_var("nombre","Perez, Juan");
esto permite asignar el valor Perez, Juan a la variable de plantilla {nombre}
Funcin parse(): tenemos que usar esta funcin para que reemplace todos los valores
definidos con set_var() en el bloque que se le pasa como parmetro.
Ej: parse("bloque1");
Funcin pparse(): Esta funcin imprime el template terminado. Toma como

84

parametro el nombre de la plantilla que abrimos anteriormente.


Ej: pparse("plantilla");
Ejemplo:

<?php
include("ezfasttemplate.php"); // incluyo la librera
// conexin a la db
include(adodb/adodb.inc.php);
$database="mysql";
$server="localhost";
$user="Linus";
$password="tux";
$db = &ADONewConnection($database);
$db->Connect($server, $user, $password, $database);
$resultado = &$conn->Execute(select * from clientes);
if (!$resultado)
print $conn->ErrorMsg();
else
while (!$resultado->EOF) {
set_var("nombre",$resultado->fields[0]);
set_var("apellido", $resultado->fields[1]);
parse("bloque2");
$resultado->MoveNext();
}
$resultado->Close(); // cierro el conjunto de registros
$conn->Close(); // cierro la conexin a la DB
set_file("plantilla_ejemplo","lista.html");
set_var("fecha", date("m-d-Y")
set_var("texto","Prcticas de Plantillas en PHP");
parse("bloque");
pparse("plantilla_ejemplo");
?>
lista.html
<HTML>
<BODY>
<!-- BEGIN bloque -->
<H1><CENTER> {texto} escrito el dia {fecha} </H1></CENTER>
<!-- END bloque -->
<!-- BEGIN bloque2 -->

54
Captulo 5. Introduccin al uso de plantillas (Templates)
<br>
nombre: {nombre} apellido: {apellido}
<br>
<!-- END bloque2 -->
<BODY>
</HTML>

En este ejemplo anterior se mostr el cdigo fuente de una plantilla de listado de


clientes y el cdigo fuente de la consulta y uso de la misma.

85

5.3. Conclusin

Las Plantillas permiten:


Separacin completa del cdigo de la presentacin
Posibilidad de hacer mltiples plantillas para los distintos navegadores(cada una con
mejor soporte).
Posibilidad de hacer mltiples plantillas, cambiando el formato de presentacin.
Ejemplo: (HTML, WML, TXT, DHTML, XML,etc).
El programador no tiene que saber diseo grfico.
El diseador grfico no tiene que saber programacin.
Si se cambia el diseo, no se cambia el cdigo fuente.
Posibilidad de un uso intensivo de herramientas visuales, para el desarrollo de la
presentacin.

Captulo 6. Persistencia y sesiones en


PHP
6.1. Introduccin a las Sesiones

Uno de los problemas clsicos en el desarrollo de web sites y aplicaciones web es la


perdida de persistencia cuando el usuario pasa de una pgina a otra. Esto es debido a
las caractersticas de diseo del protocolo HTTP que es sin estado (stateless) o sea que
no guarda informacin entre 2 pedidos de un mismo usuario. Mantener persistencia de
informacin a lo largo de la navegacin del sitio ha sido uno de los temas ms
complejos e importantes en el desarrollo de aplicaciones web.
El mtodo que desarrollaremos en este curso es el de sesin.

6.1.1. Qu es una sesin?

Se suele definir sesin como al tiempo en el que un usuario determinado se encuentra


navegando en el site, dependiendo de la definicin podemos decir que si el usuario no
navega por el site durante una cierta cantidad de minutos ha terminado su sesin en el
sitio y a partir de all cuando vuelve a ingresar lo hace en una nueva sesin.
El concepto de sesin es til porque es posible asociar a cada sesin un identificador
nico de forma tal de registrar la actividad del usuario en el site y mantener persistencia
utilizando nicamente este identificador, el problema pasa a ser como mantener la
persistencia del identificador de sesin (SID) de ahora en adelante, y las posibilidades
son las que detallamos a continuacin:

86

Cookies
Parmetros

a travs de Urls

Para explicarlo de una manera mas simple: La primera vez que el usuario entra a
nuestra aplicacin se genera un identificador nico de sesin y se entrega este al
usuario. Luego el usuario cuando contine navegando en nuestro sitio, adems de hacer
la peticin HTTP, nos enva el SID, con lo cual nosotros tenemos asociado un estado
(Variables de sesin).
Esto nos permite mantener valores de variables entre distintas peticiones del usuario.
Cuando hay que terminar la sesin, simplemente decimos que el SID ha expirado.
Las cookies es un mtodo bastante difundido, pero que no se recomienda ya que
muchos usuarios tienen desactivado en su navegador el soporte para estas.
El metodo mas interesante es el que PHP nos otorga desde la versin 4.0 o mayor. Este
mtodo se llama Transparent Session Id.
Este consiste en crear un SID para el usuario y luego en cada enlace o formulario que el
programador crea, php lo analiza y le agrega el SID. Por lo tanto el SID no se pierde y
es totalmente transparente para el programador y el cliente.

6.1.2. Como inicio una sesin?


Para iniciar una sesin por primera vez o retomar en cada pagina de nuestro sistema la
sesin y toda su informacin relacionada se debe llamar a la funcin
session_start();

PHP dispone adems de funciones para "registrar" variables dentro de una sesin, esto
se hace llamando a la funcin session_register(); , registrar significa que la
variable registrada guardara su valor durante toda la sesin.
Por ejemplo:
<?php
session_start();
$nombre="Marcos";
session_register("nombre");
?>

Notar que session_register recibe el "nombre" de la variable a registrar sin "$". Una vez
registrada una variable la misma estar disponible en todas las pginas que usen
session_start durante la sesin actual, es decir que si desde la pgina donde
hicimos el session_register el usuario se traslada a otra pgina que usa
session_start entonces la variable $nombre automticamente estar definida y con el
valor "Marcos" ya que es una variable registrada dentro de la sesin. Cualquier tipo de
variable de PHP puede registrarse con este mtodo, incluyendo objetos (slo las
87

propiedades del objeto se registran, no los mtodos!)

6.1.3. Como elimino una variable de sesin?

Para que una variable de la sesin actual deje de pertenecer a la misma se debe llamar a
la funcin session_unregister("nombrevariable");
ejemplo:
<?php
session_start();
session_unregister("nombre");
?>

6.1.4. Como finalizo una sesin?

Para finalizar una sesin esta debe estar activa y debe llamarse a la funcin
session_destroy();

Ejemplo:

<?php
session_start();
session_destroy();
?>

6.1.5. Funciones Miscelneas de sesiones

Para saber el identificador de la sesin actual SID podemos llamar a la funcin


session_id() que nos retorna el numero deseado.
Otra funcin interesante es session_is_registered("nombrevariable") que
nos retorna verdadero si la variable esta registrada en la sesin, en otro caso, falso.

6.2. Conclusin sobre el uso de sesiones.

Para entender el verdadero uso y la potencia de las sesiones, se vern en los siguientes
captulos su uso intensivo y ejemplos.

Captulo 7. Validacin de Datos


7.1. Introduccin
La validacin de los datos que un usuario ingresa en un formulario o los datos que
88

transitan entre una pgina y otra dentro de un sistema web pueden ser cambiados o
alterados por cualquier persona con mucha facilidad, por lo que la validacin es un
punto extremadamente importante al desarrollar una aplicacin y sobre todo si esta se
realiza en informacin sensible o muy importante.

7.1.1. Problemas comunes que se presentan por falta de


validaciones.
Los tipos de problemas los podemos agrupar segn su naturaleza Intencional o no.

Intencionales:
-Ingreso de cdigo HTML malicioso por parte de una persona.
-Ingreso de cdigo SQL para destruccin o alteracin de bases de datos.
-Alteracin de variables que se pasan entre pginas para ganar privilegios.
-Alteracin de pginas que pueden exponer a una empresa a humillaciones.
-Robo de Informacin.
-Destruccin de informacin.
No Intencionales:
-Ingreso de datos no vlidos en una base de datos.
-Duplicacin en en el ingreso de datos.
Como se puede ver en la lista anterior, estos problemas son muy graves, por lo que a la
validacin tiene ser aplicada de forma muy efectiva.

7.1.2. Pasos para desarrollar una validacin exitosa.

1 - Definir un diccionario de datos con los valores vlidos para cada campo.
2 - Definir para cada campo de un formulario ingreso de informacin el tipo asociado
en el diccionario de datos.
3 - Definir las variables-parmetros entre pginas y su valor.
4 - Aplicar validaciones en el lado servidor.
5 - Aplicar validacin en el lado cliente (opcional).

7.1.3. Validacin en el lado cliente.

La validacin en el cliente es posible mediante el uso del lenguaje Javascript o


EcmaScript. Esta validacin permite mejorar la velocidad y la latencia si ocurre un
error, ya que no es necesario que el servidor valide los datos, sino que el mismo
navegador hace esta tarea y advierte rpidamente al usuario ante un error. El principal
problema que tiene es que un usuario malicioso o un navegador con Javascript
deshabilitado puede saltar esta validacin de forma muy fcil, por lo que aunque se
valide en el lado cliente siempre se tiene que validar en el lado servidor.
Para tutoriales y referencias sobre javascript dirigirse al sitio web de netscape.
www.netscape.com.

7.1.4. Validacin en el lado servidor

La validacin en el servidor se debe hacer en cada peticin que el usuario realiza, y se

89

aconseja hacer una librera de funciones que validen cada tipo de campo que se
encuentra definido en el diccionario de datos, as es posible por ejemplo reusar las
funciones escritas en distintos sistemas, por ejemplo:
una funcin que valide e-mails is_email($email).
En general se usan expresiones regulares para generar estas funciones.

7.2. Introduccin a Expresiones Regulares

Las expresiones regulares vienen a ser una forma sofisticada de hacer un


buscar-reemplazar. En el mundo Windows(TM) no tienen mucho sentido, despues de
todo en el casi todo se realiza en base de clicks. Pero en el mundo Unix/Linux, en el
que casi todo son ficheros de texto, casi son una herramienta imprescindible. No tan
solo de cara al administrador, sino tambin de cara a cualquier otro programador que
puede ver como las expresiones regulares le salvan la vida en ms de una ocasin.
No es de extraar, que exista un cliente donde su e-mail aparece en cada pgina de su
documento con un mailto. Considere que pasara si dicho usuario cambia de mail...
Tampoco es de extraar que se tenga que cambiar el ao en 1500 pginas web (cosa
que me ha pasado).
No todos los comandos usan de forma idntica las expresiones regulares. Algunos de
los comandos que usan expresiones regulares son grep, egrep, sed, vi, y lex
(flex en Linux).
Cada comando implementa las expresiones regulares a su manera aunque en general
son todas bastantes parecidas. Por ejemplo grep permite usar expresiones regulares
sencillas mientras que egrep es capaz de usar expresiones regulares ms complejas.
Otros comandos adaptan el uso de expresiones a sus particulares necesidades y por ello
si bien se puede hablar en general de ellas hay que tener en cuenta las peculiaridades de
cada caso que debern ser consultadas en las paginas del manual de cada comando. Las
expresiones regulares vienen a ser una especie de lenguaje y cada comando usa su
propio dialecto. En realidad las diferencias entre los distintos dialectos suelen ser muy
pocas.

7.2.1. Los caracteres especiales que se usan en una


expresin regular
Los caracteres especiales que se usan en una expresin regular son:
[ ] cochetes
() parentesis
{} llaves
- guin
+ ms
90

* asterisco
. Punto
^ circunflejo
$ dolar
? signo de pregunta
| tubera Unix
\ barra invertida
/ barra normal

cerrado

Luego explicaremos el uso de cada caracter en especial.

7.2.2. Coincidencia total

Hay veces que se quiere crear una expresin regular para que busque exactamente
ciertos caracteres dentro de un texto:
Imaginemos que nos hemos olvidado de acentuar de palabras terminadas en ion. Para
esto simplemente la expresin regular "ion" nos basta, ya que concordara con cosas
como camion, funcion, administracion, ionizar, etc.
Supongamos que queremos buscar todos los smbolo de puntuacin "." , pensaramos
en usar la expresin regular ".", pero esto es un error ya que el punto es un caracter
especial para la expresin regular que significa cualquier caracter menos \n \r \f \0
(newline, return, line feed, null). Entonces podemos usar el caracter de escape "\" antes
del "." para que no tome a "." como caracter especial, por lo tanto la expresin
resultante es: "\n".
La barra invertida sirve para escapar todos los simbolos especiales:

\[ corchetes
\ ] cochetes
\( parntesis
\) parntesis
\{ llaves
\} llaves
\- guin
\+ ms
\* asterisco
\. Punto
\^ circunflejo
\$ dolar

64
Captulo 7. Validacin de Datos
\? signo de pregunta cerrado
\| tubera Unix
\\ barra invertida
\/ barra normal

91

7.2.3. Definiendo Rangos con expresiones regulares


Muchas veces es necesario buscar un caracter dentro de una lista de estos:

Supongamos que tenemos que buscar las palabras "las","los y "les", podramos buscar
las palabras que empiezan con la letra "l" y que le sigue la letra "a" ,o la letra "o", o la
letra "e" y que finalizan con la letra "s", para esto podemos usar la notacin
"[conjunto]" que hace coincidir un caracter con la lista que se encuentra entre
corchetes, entonces la expresin regular resultante es:
"l [aeo]s".
Si se desea buscar todos los nmeros se puede utilizar el operador "-" dentro de los
corchetes, resultando la expresin : "[0-9]"
Otros Rangos Interesantes son:
[a-z] letras minsculas
[A-Z] letras maysculas
[0-9] nmeros.
[,!;:\.\?] caracteres de puntuacin (la barra invertida hace que no se consideren como
comando ni en punto ni el signo de preguntas)
[A-Za-z] letras del alfabeto (del ingls ).
[A-Za-z0-9] todos los caracteres alfanumricos habituales (sin los de puntuacin)
[^a-z] El smbolo ^ es el de negacin. Esto es decir TODO MENOS las letras
minsculas.
[^0-9] Todo menos los nmeros.
Para definir otros rangos, no dude en usar el operador de rangos "-" por ej.: de la h a la
m [h-m].

7.2.4. Usando el operador circunflejo "^"


La utilidad del operador "^" depende del contexto donde se use:
- si se usa al principio de una expresin significa solo las lineas que empiecen con lo
que le sigue al smbolo se encontraran.
Ejemplo:
"^Primeramente" encontrar solo las lineas que comiencen con "Primeramente"
- Tambin se puede usar dentro de corchetes "[^expr]" para que encuentre todo menos
expr.
Ejemplo:
"[^0-9]" encontrar cualquier caracter distinto de un nmero

7.2.5. Uso del operador pesos "$"

Este operador se utiliza de la siguiente manera : "expr$" donde "expr" es el final de la


92

lnea. Esto significa que si se pone un "$" al final de la expresin solo se encontrarn
las lineas que finalicen con expr.
Ejemplo:
"chau\.$" encontrar las lneas que terminen con "chau.".

7.2.6. Agrupando, referenciando y extrayendo


Agrupacin

En ocasiones nos interesa usar el resultado de una parte del patrn en otro punto del
patrn de concordancia.
Tomemos por ejemplo una agenda, en la que alguien puso su telfono en medio de su
nombre.(Pepe 978878787 Gonzalez) Queremos extraer el telfono de esa frase y
guardarlo para introducirlo en otro sitio. O para usarlo como patrn de busqueda para
otra cosa.
Lo primero que hay que hacer es agrupar. Agrupar permite que el resultado del patrn
se almacene en una especie de registro para su uso posterior. El operador de
agrupamiento son los parentesis "( )"
Los registros se llaman 1, 2, 3, ... 9 segn el orden del agrupamiento en el patrn.
Ejemplo : "Esto es ([0-9]) prueba"
si el texto fuente es: "Esto es 1 prueba."
El valor 1 seria almacenado en el registro $1
Referencias
Tenemos una serie de elementos agrupados, a los cuales se les ha asignado un valor.
Ahora queremos usar ese valor en algn otro punto del patrn de concordancia. Pues
para eso existen las referencias.
\1 representa la referencia al grupo 1
Ejemplo : "([0-9]) \1 ([0-9])"
si el texto es : 3 3 5
El resultado es: $1 = vale 3
\1 --hace referencia al resultado del primer grupo = vale 3
$2 --segundo grupo-- vale 5
En este caso hubiese habido concordancia, no as si el texto hubiese sido 3 5 3

93

Extraccin
La extraccin es simplemente usar el $1 en los mensajes que se generan despues de
haber usado la expresin regular.

7.2.7. Expresiones opcionales y alternativas.

Hasta ahora todo lo que hemos visto han sido condiciones mas bien del tipo AND (Y).
Es evidente que nos faltan las condiciones de tipo opcional y alternativo.
Opcionales
El smbolo que se emplea para indicar que una parte del patrn es opcional es el
interrogante. "?" "[0-9]? ejemplo"
Esto concuerda tanto con textos del tipo:
"1 ejemplo, aqu desarrollaremos ..."
"ejemplo"
"2 ejemplo"
Alternativas
No confundamos alternativas con opciones, la alternativa es el equivalente a la OR no
lo era as el operador opcional. Veamos la diferencia. Por cierto, el smbolo de la
alternativa es "|".
"[0-9]? (EJEMPLO|ejemplo)"
a: 1 ejemplo
b: 1 EJEMPLO
c: 1
d: EJEMPLO
a,b,d concuerdan con el patrn. Sin embargo c no concuerda con el patrn! Porque
ejemplo o EJEMPLO son alternativas vlidas, pero tiene que haber uno de los 2. No
ocurre lo mismo con la opcionalidad, el 1 puede estar o no estar. Esa es la principal
diferencia.

7.2.8. Contando expresiones

A estas alturas te estas preguntando qu mas se puede hacer con una expresin. Pues la
verdad es que ya queda poca cosa, pero lo de contarlas! vamos ... eso es imprescindible.
El operador para esta ocasin son las llaves {m,n}
Donde m, n son 2 enteros positivos con n mayor o igual que m. Esto se lee as ... la
expresin debe cumplirse al menos m veces y no mas de n veces.

94

Podemos usar {n}o bien {n,} para indicar que queremos que se repita exactamente n
veces o que se repita n veces o ms respectivamente.
De tal forma que el patrn "go{1,4}l"
a: gool
b: gooooooooool
c: gooool
concordara con a y c pero no as con c

7.2.9. Expresiones repetidas

Tenemos el operador * asterisco que representa que el patrn indicado debe aparecer 0
o mas veces y el operador + suma que representa que el patrn indicado debe aparecer
1 o ms veces (pero al menos 1).
Ejemplo: " (Hola )* ", coincidir con vacio y con "Hola" y con "Hola Hola" ...

7.2.10. Como usar expresiones regulares en PHP

Estas expresiones regulares valen para casi cualquier lenguaje o herramienta. Ahora
explicaremos las funciones disponibles en PHP para su uso:
- ereg(modelo, cadena de caracteres, correspondencia_grupo)
El modelo que se desea comparar puede contener varios tipos de caracteres especiales y
se analiza de acuerdo con reglas sintcticas regexp especficas. La funcin busca el
segundo argumento para la regexp dada. El tercer argumento es opcional y especifica
un grupo que recolecta todas las correspondencias. El resultado de la funcin es
VERDADERO si hay al menos una correspondencia.
Ejemplo:

<?
if( ereg("^((0-9){1,3}\.){3}(0-9)$", $ip, $occurrencias) )
{
echo " La variable ip es una ip vlida";
}else
{
"la variable no es una ip vlida";
}
?>

- ereg_replace(modelo, reemplazo, cadena de caracteres)


Busca en el tercer argumento para el modelo dado como primer argumento y reemplaza
todas las correspondencias por el segundo argumento. Se retorna la nueva cadena de
caracteres. Si no hay equivalencia, la cadena de caracteres retornada es la misma inicial.

95

Ejemplo:

<?
$buscado = "Texto con \n saltos \n de lnea.";
print(ereg_replace("\n", "<br>", $buscado));
?>
- eregi(modelo, cadena de caracteres, correspondencia_grupo)

Esta funcin es similar a ereg, excepto que la bsqueda no hace la diferencia entre
maysculas y minsculas.
- eregi_replace(modelo, reemplazo, cadena de caracteres)
Esta funcin es similar a ereg_reemplazar, excepto que no se hace la diferencia entre
maysculas y minsculas.

96

También podría gustarte