Apuntes Curso PHP

100
Curso de Desarrollo de Aplicaciones Web Dardo Guidobono [email protected] Marcelo Toledo [email protected]

description

curso php

Transcript of Apuntes Curso PHP

  • Curso de Desarrollo de Aplicaciones Web

    Dardo Guidobono [email protected]

    Marcelo Toledo [email protected]

  • 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

  • 1

    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

  • 2

    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 Ejemplo Hola esta es una prueba

    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

  • 3

    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

  • 4

    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.-

  • 5

    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 + + 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

    Ejemplo: prueba.php Ejemplo de PHP Parte de HTML normal.

  • 6

    Esto es texto 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:/// http:///

    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:

  • 7

    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 Ejemplo de PHP

  • 8

    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 Ejemplo Descripcin + Suma 5 + 6 Suma dos nmeros - Resta 7 - 9 Resta dos nmeros * Multiplicacin 6 * 3 Multiplica dos nmeros / Divisin 4 / 8 Divide dos nmeros % Mdulo 7 % 2 Devuelve el resto la divisin ++ Suma 1 $a++ Suma 1 al contenido de $a. -- Resta 1 $a-- Resta 1 al contenido de $a.

    Ejemplo de PHP

  • 9

    echo $a + $b,""; echo $a - $b,""; echo $a * $b,""; echo $a / $b,""; $a++; echo $a,""; $b--; echo $b,""; ?>

    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 = $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 Nombre Ejemplo Devuelve cierto cuando: && Y (7>2) && (22) and (2

  • 10

    || O (7>2) || (22) or (22) Niega el valor de la expresin.

    Ejemplo de PHP

    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

  • 11

    } ?> La sentencia if ejecuta una serie de instrucciones u otras dependiendo de la condicin que le pongamos.

    Ejemplo de PHP

    Comando switch

    Ejemplo de PHP

  • 12

    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"; } ?>

    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

    Mientras la condicin sea cierta se reiterar la ejecucin de las instrucciones que estn dentro del while.

    Ejemplo de PHP

  • 13

    Inicio Final

    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.

    Ejemplo de PHP

  • 14

    Inicio Final

    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.

  • 15

    Ejemplo de PHP

    La cadena de formato puede incluir una seria de caracteres especiales que indican como formatear las variables que se incluyen en la instruccin.

    Formato ipo de Variable %s String %d Entero %f Nmero Decimal %c 1 solo carcter

    Ejemplo de PHP 13 Captulo 2. El lenguaje PHP

  • 16

    printf(""); ?>

    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.

  • 17

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

    Ejemplo de PHP

    El resultado se ve en el siguente cuadro:

  • 18

    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.

    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.

    Ejemplo de PHP

    En el siguiente cuadro visualiza el resultado:

  • 19

    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

    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);

    Y el resultado se ve en el siguiente cuadro.

  • 20

    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"),

  • 21

    "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.

  • 22

    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

  • 23

    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 abstractos e informacin encapsulada (estado + metodos) Herencia Polimorfismo La encapsulacin en PHP se codifica utilizando clases (tipo de objetos que comparten comportamientos y caractersticas):

  • 24

    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":

  • 25

    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.

    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:

  • 26

    $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.

    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.

  • 27

    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()

  • 28

    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 }

  • 29

    }

    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")

  • 30

    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:

  • 31

    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 "destruido: " . $this->nombre; }

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

    //instanciamos un par de objetos cliente

  • 32

    $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 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

  • 33

    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;$itirate(); echo "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

  • 34

    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;$idame_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.

  • 35

    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

  • 36

    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;

  • 37

    }

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

    public function imprime_caracteristicas(){ echo $this->titulo; echo "" . $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 "" . $soporte1->titulo . ""; echo "Precio: " . $soporte1->dame_precio_sin_iva() . " euros"; echo "Precio IVA incluido: " . $soporte1->dame_precio_con_iva() . " euros";

  • 38

    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

  • 39

    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:"; parent::imprime_caracteristicas(); echo "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

  • 40

    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 "" . $micinta->titulo . ""; echo "Precio: " . $micinta->dame_precio_sin_iva() . " euros"; echo "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.

  • 41

    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:"; parent::imprime_caracteristicas(); echo "" . $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;

  • 42

    $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 "Para un jugador"; else echo "Para " . $this->min_num_jugadores . " jugadores"; }else{ echo "De " . $this->min_num_jugadores . " a " . $this->max_num_jugadores . " Jugadores."; } }

    public function imprime_caracteristicas(){ echo "Juego para: " . $this->consola . ""; parent::imprime_caracteristicas(); echo "" . $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 "Jugadores: " . $mijuego->min_num_jugadores; //habria que crear un mtodo para que acceda a los atributos private $mijuego->imprime_jugadores_posibles();

  • 43

    echo ""; $mijuego2 = new juego("GP Motoracer", 27, 3, "Playstation II",1,2); echo "" . $mijuego2->titulo . ""; $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.

  • 44

    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

  • 45

    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;$isoportes_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;$imax_alquiler_concurrente;$i++){ if (!is_null($this->soportes_alquilados[$i])){

  • 46

    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 "El cliente ya tiene alquilado el soporte " . $soporte->titulo . ""; }elseif ($this->num_soportes_alquilados==$this->max_alquiler_concurrente){ echo "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])){

  • 47

    $cont++; } $this->soportes_alquilados[$cont]=$soporte; $this->num_soportes_alquilados++; echo "Alquilado soporte a: " . $this->nombre . ""; $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 "Este cliente no tiene alquilado ningn elemento"; return false; } //recorro el array a ver si encuentro el soporte con identificador recibido for ($i=0;$imax_alquiler_concurrente;$i++){ if (!is_null($this->soportes_alquilados[$i])){ if ($this->soportes_alquilados[$i]->dame_numero_identificacion() == $identificador_soporte){ echo "Soporte devuelto: " . $identificador_soporte; echo " " . $this->soportes_alquilados[$i]->titulo . ""; $this->soportes_alquilados[$i]=null; $this->num_soportes_alquilados--; return true; } } } //si estoy aqui es que el cliente no tiene ese soporte alquilado echo "No se ha podido encontrar el soporte en los alquileres de este cliente"; return false; }

  • 48

    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 "Este cliente no tiene alquilado ningn elemento"; }else{ echo "El cliente tiene " . $this->num_soportes_alquilados . " soportes alquilados"; //recorro el array para listar los elementos que tiene alquilados for ($i=0;$imax_alquiler_concurrente;$i++){ if (!is_null($this->soportes_alquilados[$i])){ echo ""; $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 "Cliente " . $this->numero . ": " . $this->nombre; echo "Alquileres actuales: " . $this->num_soportes_alquilados }

  • 49

    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 "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);

  • 50

    //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

  • 51

    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, pode