Sunteți pe pagina 1din 29

Clases en PHP 5 Clases en PHP 5 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 !n objeto se define indicando qu" propiedades # funcionalidades tiene $ustamente esas declaraciones son lo que es una clase Cuando se %ace una clase simplemente se especifica qu" propiedades # funcionalidades tiene Por ejemplo, un %ombre podr&a tener como propiedades el nombre o la edad # como funcionalidades, comer, moverse o estudiar 'n la clase %ombre declarar&amos dos atributos( la edad o el nombre, que ser&an como dos variables )ambi"n deber&amos crear tres m"todos, con los procedimientos a seguir para que el %ombre pueda comer, moverse o estudiar 'stos m"todos se definen declarando funciones dentro de la clase 'l cdigo para definir una clase se puede ver a continuacin( class %ombre* var +nombre, var +edad, function comer(+comida)* --aqu& el cdigo del m"todo . function moverse(+destino)* --aqu& el cdigo del m"todo . function estudiar(+asignatura)* --aqu& el cdigo del m"todo . /anual de PHP 5 0 /anual completo P1gina 2 de 34. Podr1 comprobarse que este cdigo no difiere en nada del de las versiones anteriores de PHP, que #a soportaban ciertas caracter&sticas de la POO 'sta situacin cambiar1 a poco que e5ploremos las caracter&sticas m1s avan6adas de PHP 5, que implicar1n mejoras que no estaban presentes en las versiones anteriores 7nstanciar objetos a partir de clases Hemos visto que una clase es tan slo una definicin 8i queremos trabajar con las clases debemos instanciar objetos, proceso que consiste en generar un ejemplar de una clase Por ejemplo, tenemos la clase %ombre anterior Con la clase en si no podemos %acer nada, pero podemos crear objetos %ombre a partir de esa clase Cada objeto %ombre tendr1 unas caracter&sticas propias, como la edad o el nombre 9dem1s podr1 desempe:ar unas funciones como comer o moverse, a%ora bien, cada uno comer1 o se mover1 por su cuenta cuando le sea solicitado, sin interferir en principio con lo que pueda estar %aciendo otro %ombre ;a que estamos, vamos a ver cmo se generar&an un par de %ombres, es decir, cmo se instanciar&an un par de objetos de la clase %ombre Para ello utili6amos el operador ne< +pepe = ne< %ombre(), +juan = ne< %ombre(), Conclusin 's importante darse cuenta de la diferencia entre un objeto # una clase La clase es una definicin de unas caracter&sticas # funcionalidades, algo abstracto que se concreta con la instanciacin de un objeto de dic%a clase !n objeto #a tiene propiedades, con sus valores concretos, # se le pueden pasar mensajes (llamar a los m"todos) para que %agan cosas

Constructores en PHP 5 Los constructores se encargan de resumir las acciones de iniciali6acin de los objetos Cuando se instancia un objeto, se tienen que reali6ar varios pasos en su iniciali6acin, por ejemplo dar valores a sus atributos # eso es de lo que se encarga el constructor Los constructores pueden recibir unos datos para iniciali6ar los objetos como se desee en cada caso La sinta5is para la creacin de constructor var&a con respecto a la de PHP 3 # >, pues debe llamarse con un nombre fijo( ??construct() (8on dos guiones bajos antes de la palabra @construct@) 9 lo largo de los ejemplos de este manual vamos a ir creando un cdigo para gestin de un videoclub Aamos a empe6ar definiendo una clase cliente, que utili6aremos luego en nuestro programa class cliente* var +nombre, var +numero, var +peliculas?alquiladas, function ??construct(+nombre,+numero)* +t%is0Bnombre=+nombre, +t%is0Bnumero=+numero, +t%is0Bpeliculas?alquiladas=arra#(), . function dame?numero()* return +t%is0Bnumero, . . /anual de PHP 5 0 /anual completo P1gina C de 34'l constructor en esta clase recibe el nombre # nDmero que asignar al cliente, que introduce luego en sus correspondientes propiedades 9dem1s iniciali6a el atributo pel&culas?alquiladas como un arra#, en este caso vac&o porque todav&a no tiene ninguna pel&cula en su poder Luego %emos creado un m"todo mu# sencillo para poder utili6ar el objeto Aamos a ver unas acciones simples para ilustrar el proceso de instanciacin # utili6acin de los objetos --instanciamos un par de objetos cliente +clienteE = ne< cliente(@Pepe@, E), +clienteF = ne< cliente(@Goberto@, 54>), --mostramos el numero de cada cliente creado ec%o @'l identificador del cliente E es( @ +clienteE0Bdame?numero(), ec%o @'l identificador del cliente F es( @ +clienteF0Bdame?numero(), 'ste ejemplo obtendr&a esta salida como resultado de su ejecucin( 'l identificador del cliente E es( E 'l identificador del cliente F es( 54> Hestructores en PHP 5 Los destructores son funciones que se encargan de reali6ar las tareas que se necesita ejecutar cuando un objeto deja de e5istir Cuando un objeto #a no est1 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 'n el momento de su destruccin se llama a la funcin destructor, que puede reali6ar las tareas que el programador estime oportuno reali6ar La creacin del destructor es opcional 8lo debemos crearlo si deseamos %acer alguna cosa cuando un objeto se elimine de la memoria 'l destructor es como cualquier otro m"todo de la clase, aunque debe declararse con un nombre fijo( ??destruct()

'n el cdigo siguiente vamos a ver un destructor en funcionamiento 9unque la accin que reali6a al destruirse el objeto no es mu# Dtil, nos puede servir bien para ver cmo trabaja class cliente* var +nombre, var +numero, var +peliculas?alquiladas, function ??construct(+nombre,+numero)* +t%is0Bnombre=+nombre, +t%is0Bnumero=+numero, +t%is0Bpeliculas?alquiladas=arra#(), . function ??destruct()* ec%o @IbrBdestruido( @ +t%is0Bnombre, . function dame?numero()* return +t%is0Bnumero, . . --instanciamos un par de objetos cliente +clienteE = ne< cliente(@Pepe@, E), Jota( 'n programacin orientada a objetos +t%is %ace referencia al objeto sobre el que se est1 ejecutando el m"todo 'n este caso, como se trata de un constructor, +t%is %ace referencia al objeto que se est1 constru#endo Con +t%is0Bnombre=+nombre, estamos asignando al atributo KnombreL del objeto que se est1 constru#endo el valor que contiene la variable +nombre, que se %a recibido por par1metro /anual de PHP 5 0 /anual completo P1gina M de 34+clienteF = ne< cliente(@Goberto@, 54>), --mostramos el numero de cada cliente creado ec%o @'l identificador del cliente E es( @ +clienteE0Bdame?numero(), ec%o @IbrB'l identificador del cliente F es( @ +clienteF0Bdame?numero(), 'ste cdigo es igual que el anterior 8lo se %a a:adido el destructor, que imprime un mensaje en pantalla con el nombre del cliente que se %a destruido )ras su ejecucin obtendr&amos la siguiente salida 'l identificador del cliente E es( E 'l identificador del cliente F es( 54> destruido( Pepe destruido( Goberto Como vemos, antes de acabar el script, se libera el espacio en memoria de los objetos, con lo que se ejecuta el destructor # aparece el correspondiente mensaje en la p1gina !n objeto puede quedar sin referencias # por lo tanto ser destruido, por muc%as ra6ones Por ejemplo, el objeto puede ser una variable local de una funcin # al finali6arse la ejecucin de esa funcin la variable local dejar&a de tener valide6, con lo que debe destruirse 'l cdigo siguiente ilustra cmo una variable local a cualquier 1mbito (por ejemplo, local a una funcin), se destru#e cuando ese 1mbito %a finali6ado function crea?cliente?local()* +cliente?local = ne< cliente(@so# 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 e5istir # por lo tanto se llama al destructor definido para ese objeto /odificadores de acceso a m"todos # propiedades en PHP5 Aeremos en este cap&tulo los nuevos modificadores de acceso a los m"todos # atributos de los objetos que se %an incorporado en PHP 5 'stos modificadores de acceso no son otros que los conocidos public, protected # private, que #a disponen otros lenguajes como $ava !no de los principios de la programacin orientada a objetos es la encapsulacin, que es un proceso por el que se ocultan las caracter&sticas internas de un objeto a aquellos elementos que no tienen porque conocerla Los modificadores de acceso sirven para indicar los permisos que tendr1n otros objetos para acceder a sus m"todos # propiedades /odificador public 's el nivel de acceso m1s permisivo 8irve para indicar que el m"todo o atributo de la clase es pDblico 'n este caso se puede acceder a ese atributo, para visuali6arlo o editarlo, por cualquier otro elemento de nuestro programa 's el modificador que se aplica si no se indica otra cosa Aeamos un ejemplo de clase donde %emos declarado como public sus elementos, un m"todo # una propiedad 8e trata de la clase @dado@, que tiene un atributo con su puntuacin # un m"todo para tirar el dado # obtener una nueva puntuacin aleatoria Jota( )ambi"n podemos des%acernos de un objeto sin necesidad que acabe el 1mbito donde fue creado Para ello tenemos la funcin unset() que recibe una variable # la elimina de la memoria Cuando se pierde una variable que contiene un objeto # ese objeto deja de tener referencias, se elimina al objeto # se llama al destructor /anual de PHP 5 0 /anual completo P1gina EN de 34class dado* public +puntos, function ??construct()* srand((double)microtime()OENNNNNN), . public function tirate()* +t%is0Bpuntos=+randval = rand(E,4), . . +mi?dado = ne< dado(), for (+i=N,+iI3N,+iPP)* +mi?dado0Btirate(), ec%o @IbrBHan salido @ +mi?dado0Bpuntos @ puntos@, . Aemos la declaracin de la clase dado # luego unas l&neas de cdigo para ilustrar su funcionamiento 'n el ejemplo se reali6a un bucle 3N veces, en las cuales se tira el dado # se muestra la puntuacin que se %a obtenido Como el atributo +puntos # el m"todo tirate() son pDblicos, se puede acceder a ellos desde fuera del objeto, o lo que es lo mismo, desde fuera del cdigo de la clase /odificador private 's el nivel de acceso m1s restrictivo 8irve para indicar que esa variable slo se va a poder acceder desde el propio objeto, nunca desde fuera 8i intentamos acceder a un m"todo o atributo declarado private desde fuera del propio objeto, obtendremos un mensaje de error indicando que no es posible a ese elemento 8i en el ejemplo anterior %ubi"ramos declarado private el m"todo # la propiedad de la clase

dado, %ubi"ramos recibido un mensaje de error 9qu& tenemos otra posible implementacin de la clase dado, declarando como private el atributo puntos # el m"todo tirate() class dado* private +puntos, function ??construct()* srand((double)microtime()OENNNNNN), . private function tirate()* +t%is0Bpuntos=+randval = rand(E,4), . public function dame?nueva?puntuacion()* +t%is0Btirate(), return +t%is0Bpuntos, . . +mi?dado = ne< dado(), for (+i=N,+iI3N,+iPP)* ec%o @IbrBHan salido @ +mi?dado0Bdame?nueva?puntuacion() @ puntos@, . Hemos tenido que crear un nuevo m"todo pDblico para operar con el dado, porque si es todo privado no %a# manera de %acer uso de "l 'l mencionado m"todo es dame?nueva?puntuacin (), que reali6a la accin de tirar el dado # devolver el valor que %a salido /anual de PHP 5 0 /anual completo P1gina EE de 34/odificador protected 'ste indica un nivel de acceso medio # un poco m1s especial que los anteriores 8irve para que el m"todo o atributo sea pDblico dentro del cdigo de la propia clase # de cualquier clase que %erede de aquella donde est1 el m"todo o propiedad protected 's privado # no accesible desde cualquier otra parte 's decir, un elemento protected es pDblico dentro de la propia clase # en sus %eredadas /1s adelante e5plicaremos la %erencia # podremos ofrecer ejemplos con el modificador protected Conclusin /uc%as veces el propio desarrollador es el que fija su criterio a la %ora de aplicar los distintos modificadores de acceso a atributos # m"todos Poca proteccin implica que los objetos pierdan su encapsulacin # con ello una de las ventajas de la POO !na proteccin ma#or puede %acer m1s laborioso de generar el cdigo del programa, pero en general es aconsejable La %erencia en PHP5 La %erencia es uno de los mecanismos fundamentales de la programacin orientada a objetos Por medio de la %erencia, se pueden definir clases a partir de la declaracin de otras clases Las clases que %eredan inclu#en tanto los m"todos como las propiedades de la clase a partir de la que est1n definidos Por ejemplo, pensemos en la clase @ve%&culo@ 'sta clase general puede incluir las caracter&sticas generales de todos los ve%&culos (atributos de la clase), como la matr&cula, a:o de fabricacin # potencia 9dem1s, incluir1 algunas funcionalidades (m"todos de la clase) como podr&an ser, arrancar() o moverse() 9%ora bien, en la pr1ctica e5isten varios tipos de ve%&culos, como los coc%es, los autobuses # los camiones )odos ellos tienen unas caracter&sticas comunes, que %an sido definidas en la clase ve%&culo 9dem1s, tendr1n una serie de caracter&sticas propias del tipo de ve%&culo, que, en principio, no tienen otros tipos de ve%&culos Por ejemplo, los camiones pueden tener una

carga m15ima permitida o los autobuses un nDmero de pla6as disponibles Hel mismo modo, las clases m1s espec&ficas pueden tener unas funcionalidades propias, como los camiones cargar() # descargar(), o los autobuses aceptar?pasajeros() o vender?billete() Lo normal en sistemas de %erencia es que las clases que %eredan de otras inclu#an nuevas caracter&sticas # funcionalidades, aparte de los atributos # m"todos %eredados Pero esto no es imprescindible, de modo que se pueden crear objetos que %ereden de otros # no inclu#an nada nuevo 8inta5is de %erencia 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 jerarqu&as de objetos que %eredan unos de otros Aeremos a%ora cmo definir estas estructuras de %erencia 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 pel&culas (cintas de v&deo o HAH) # los juegos Cada elemento tiene unas caracter&sticas propias # algunas comunes Hemos llamado @soporte@ a la clase general, que inclu#e las caracter&sticas comunes para todos los tipos de elementos en alquiler Luego %emos creado tres tipos de soportes distintos, que %eredan de la clase soporte, pero que inclu#en algunas caracter&sticas # funcionalidades nuevas 'stos tipos de soporte ser1n @cinta?video@, @dvd@ # @juego@ /anual de PHP 5 0 /anual completo P1gina EF de 34'l esquema de %erencia que vamos a reali6ar en este ejemplo se puede ver en la siguiente imagen 'mpe6amos por la clase soporte 8u cdigo ser1 el siguiente( class soporte* public +titulo, protected +numero, private +precio, function ??construct(+tit,+num,+precio)* +t%is0Btitulo = +tit, +t%is0Bnumero = +num, +t%is0Bprecio = +precio, . public function dame?precio?sin?iva()* return +t%is0Bprecio, . public function dame?precio?con?iva()* return +t%is0Bprecio O E E4, . public function dame?numero?identificacion()* return +t%is0Bnumero, . public function imprime?caracteristicas()* ec%o +t%is0Btitulo, ec%o @IbrB@ +t%is0Bprecio @ (7A9 no incluido)@, . . Los atributos que %emos definido son, t&tulo, numero (un identificador del soporte) # 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 iniciali6acin del objeto !n m"todo dame?precio?sin?iva(), que devuelve el precio del soporte, sin aplicarle el 7A9 Otro m"todo dame?precio?con?iva(), que devuelve el precio una ve6 aplicado el E4Q de 7A9 'l m"todo dame?numero?identificacion(), que devuelve el nDmero de identificador # imprime?caracteristicas(), que muestra en la p1gina las caracter&sticas de este soporte 'n todos los m"todos se %ace uso de la variable +t%is 'sta variable no es m1s que una Jota( Como se %a definido como private el atributo precio, este atributo slo se podr1 acceder dentro del cdigo de la clase, es decir, en la propia definicin del objeto 8i queremos acceder al precio desde fuera de la clase (algo mu# normal si tenemos en cuenta que vamos a necesitar el precio de un soporte desde otras partes de la aplicacin) ser1 necesario crear un m"todo que nos devuelva el valor del precio 'ste m"todo deber&a definirse como public, para que se pueda acceder desde cualquier sitio que se necesite /anual de PHP 5 0 /anual completo P1gina E3 de 34referencia al objeto sobre el que se est1 ejecutando el m"todo 'n programacin orientada a objetos, para ejecutar cualquiera de estos m"todos, primero tenemos que %aber creado un objeto a partir de una clase Luego podremos llamar los m"todos de un objeto 'sto se %ace con +mi?objeto0Bmetodo?a?llamar() Hentro de m"todo, cuando se utili6a la variable +t%is, se est1 %aciendo referencia al objeto sobre el que se %a llamado al m"todo, en este caso, el objeto +mi?objeto Con +t%is0Btitulo estamos %aciendo referencia al atributo @titulo@ que tiene el objeto +mi?objeto 8i queremos probar la clase soporte, para confirmar que se ejecuta correctamente # que ofrece resultados co%erentes, podemos utili6ar un cdigo como el siguiente +soporteE = ne< soporte(@Los 7ntocables@,FF,3), ec%o @IbB@ +soporteE0Btitulo @I-bB@, ec%o @IbrBPrecio( @ +soporteE0Bdame?precio?sin?iva() @ euros@, ec%o @IbrBPrecio 7A9 incluido( @ +soporteE0Bdame?precio?con?iva() @ euros@, 'n este caso %emos creado una instancia de la clase soporte, en un objeto que %emos llamado +soporteE Luego imprimimos su atributo titulo (como el t&tulo %a sido definido como public, podemos acceder a "l desde fuera del cdigo de la clase Luego se llaman a los m"todos dame?precio?sin?iva() # dame?precio?con?iva() para el objeto creado Jos dar&a como resultado esto( Los 7ntocables Precio( 3 euros Precio 7A9 incluido( 3 >C euros 'n siguientes cap&tulos vamos a ver cmo definir clases que %ereden de la clase soporte La %erencia en PHP 5, 8egunda parte Como estamos viendo, los mecanismos de %erencia en PHP5 son similares a los e5istentes en otros lenguajes de programacin 9%ora vamos a relatar cmo construir una clase que %ereda de otra Continuando con nuestro ejemplo de videoclub, vamos a construir una clase para los soportes de tipo cinta de video Las cintas de v&deo tienen un atributo nuevo que es la duracin de la cinta Jo tienen ninguna clase nueva, aunque debemos aprender a sobrescribir m"todos creados para el soporte, dado que a%ora tienen que %acer tareas m1s espec&ficas 8obrescribir m"todos 9ntes de mostrar el cdigo de la clase cinta?video, vamos a %ablar sobre la sobrescritura o sustitucin de m"todos, que es un mecanismo por el cual una clase que %ereda puede redefinir

los m"todos que est1 %eredando Pensemos en una cafetera 8abemos que e5isten muc%os tipos de cafeteras # todas %acen caf", pero el mecanismo para %acer el caf" es distinto dependiendo del tipo de cafetera '5isten cafeteras e5press, cafeteras por goteo # %asta se puede %acer caf" con un calcet&n Juestra cafetera @padre@ (de la que va a %eredar todas las cafeteras) puede tener definido un m"todo %acer?cafe(), pero no necesariamente todas las cafeteras que puedan %eredar de esta %acen el caf" siguiendo el mismo proceso 'ntonces podemos definir un m"todo para %acer caf" est1ndar, que tendr&a la clase cafetera Pero al definir las clases cafetera?e5press # cafetera?goteo, deber&amos sobrescribir el m"todo %acer?cafe() para que se ajuste al procedimiento propio de estas La sobrescritura de m"todos es algo bastante comDn en mecanismos de %erencia, puesto que /anual de PHP 5 0 /anual completo P1gina E> de 34los m"todos que fueron creados para una clase @padre@ no tienen por qu" ser los mismos que los definidos en las clases que %eredan Aeremos cmo sobrescribir o sustituir m"todos en un ejemplo de %erencia, siguiendo nuestro ejemplo de videoclub 8inta5is para %eredar en PHP 5 Hab&amos comentado que el videoclub dispone de distintos elementos para alquilar, como cintas de v&deo, HAH o juegos Hab&amos creado una clase soporte, que vamos a %eredar en cada uno de los elementos disponibles para alquiler Aamos a empe6ar por la clase cinta?video, cu#o cdigo ser1 el siguiente class cinta?video e5tends soporte* private +duracion, function ??construct(+tit,+num,+precio,+duracion)* parent((??construct(+tit,+num,+precio), +t%is0Bduracion = +duracion, . public function imprime?caracteristicas()* ec%o @Pel&cula en AH8(IbrB@, parent((imprime?caracteristicas(), ec%o @IbrBHuracin( @ +t%is0Bduracion, . . Con la primera l&nea class cinta?video e5tends soporte estamos indicando que se est1 definiendo la clase cinta?video # que va a %eredar de la clase soporte 'n la clase cinta?video %emos definido un nuevo atributo llamado +duracion, que almacena el tiempo que dura la pel&cula 9unque la clase sobre la que %eredamos (la clase soporte) ten&a definido un constructor, la cinta de v&deo debe iniciali6ar la nueva propiedad +duracion, que es espec&fica de las cintas de video Por ello, vamos a sobrescribir o sustituir el m"todo constructor, lo que se %ace simplemente volviendo a escribir el m"todo La gracia aqu& consiste en que el sistema puede basar la nueva declaracin del constructor en la declaracin que e5ist&a para la clase de la que %ereda 's decir, #a se %ab&a definido un constructor para la clase soporte, que iniciali6aba los atributos de esta clase 9%ora, para la clase cinta?video, %a# que iniciali6ar los atributos definidos en la clase soporte, m1s el atributo +duracion, que es propio de cinta?video 'l cdigo del constructor es el siguiente( function ??construct(+tit,+num,+precio,+duracion)* parent((??construct(+tit,+num,+precio),

+t%is0Bduracion = +duracion, . 'n la primera l&nea del constructor se llama al constructor creado para la clase @soporte@ Para ello utili6amos parent(( # luego el nombre del m"todo de la clase padre al que se quiere llamar, en este caso ??constructor() 9l constructor de la clase padre le enviamos las variables que se deben iniciali6ar con la clase padre 'n la segunda l&nea del constructor se iniciali6a el atributo duracion, con lo que %a#amos Jota( Como se est1 %eredando de una clase, PHP tiene que conocer el cdigo de la clase @padre@, en este caso la clase soporte He modo que el cdigo de la clase soporte debe estar incluido dentro del arc%ivo de la clase cinta?video Podemos colocar los dos cdigos en el mismo fic%ero, o si est1n en fic%eros independientes, debemos incluir el cdigo de la clase soporte con la instruccin include o require de PHP /anual de PHP 5 0 /anual completo P1gina E5 de 34recibido por par1metro Jos pasa lo mismo con el m"todo imprime?caracteristicas(), que a%ora debe mostrar tambi"n el nuevo atributo, propio de la clase cinta?video Como se puede observar en el cdigo de la funcin, se %ace uso tambi"n de parent((imprime?caracteristicas() para utili6ar el m"todo definido en la clase padre 8i queremos probar la clase cinta?video, podriamos utili6ar un cdigo como este( +micinta = ne< cinta?video(@Los Otros@, FF, > 5, @EE5 minutos@), ec%o @IbB@ +micinta0Btitulo @I-bB@, ec%o @IbrBPrecio( @ +micinta0Bdame?precio?sin?iva() @ euros@, ec%o @IbrBPrecio 7A9 incluido( @ +micinta0Bdame?precio?con?iva() @ euros@, Lo que nos devolver&a lo siguiente( Los Otros Precio( > 5 euros Precio 7A9 incluido( 5 FF euros Pel&cula en AH8( Los Otros > 5 (7A9 no incluido) Huracin( EE5 minutos La %erencia en PHP5, )ercera parte La clase soporte tiene otras clases que %eredan de ella # que todav&a no %emos definido Aeamos primero el cdigo de la clase @dvd@, que es mu# parecido al visto para la clase cinta?video Lo Dnico que cambia es que a%ora vamos a definir otros atributos relacionados con los HAH, como son los idiomas disponibles en el HAH # el formato de pantalla que tiene la grabacin class dvd e5tends soporte* public +idiomas?disponibles, private +formato?pantalla, function ??construct(+tit,+num,+precio,+idiomas,+pantalla)* parent((??construct(+tit,+num,+precio), +t%is0Bidiomas?disponibles = +idiomas, +t%is0Bformato?pantalla = +pantalla, . public function imprime?caracteristicas()* ec%o @Pel&cula en HAH(IbrB@, parent((imprime?caracteristicas(),

ec%o @IbrB@ +t%is0Bidiomas?disponibles, . . Por su parte, la clase juego, tendr1 3 nuevos atributos 'stos son @consola@, para especificar la consola para la que est1 creado este juego, @min?num?jugadores@, para especificar el nDmero de jugadores m&nimo # @ma5?num?jugadores@, para especificar el m15imo nDmero de jugadores que pueden participar en el juego 'ste ser1 el cdigo de la clase juego class juego e5tends soporte* public +consola, --nombre de la consola del juego ej( pla#station private +min?num?jugadores, Jota(Para una e5plicacin detallada de este cdigo os referimos al cap&tulo anterior, donde se e5plicaba la clase cinta?video # la sobrescritura de m"todos /anual de PHP 5 0 /anual completo P1gina E4 de 34 private +ma5?num?jugadores, function ??construct(+tit,+num,+precio,+consola,+min?j,+ma5?j)* parent((??construct(+tit,+num,+precio), +t%is0Bconsola = +consola, +t%is0Bmin?num?jugadores = +min?j, +t%is0Bma5?num?jugadores = +ma5?j, . public function imprime?jugadores?posibles()* if (+t%is0Bmin?num?jugadores == +t%is0Bma5?num?jugadores)* if (+t%is0Bmin?num?jugadores==E) ec%o @IbrBPara un jugador@, else ec%o @IbrBPara @ +t%is0Bmin?num?jugadores @ jugadores@, .else* ec%o @IbrBHe @ +t%is0Bmin?num?jugadores @ a @ +t%is0Bma5?num?jugadores @ $ugadores @, . . public function imprime?caracteristicas()* ec%o @$uego para( @ +t%is0Bconsola @IbrB@, parent((imprime?caracteristicas(), ec%o @IbrB@ +t%is0Bimprime?jugadores?posibles(), . . Jos fijamos en el constructor, que llama al constructor de la clase padre para iniciali6ar algunos atributos propios de los soportes en general Luego nos fijamos en el m"todo imprime?jugadores?posibles(), que muestra los jugadores permitidos Ha sido declarada como public, para que se pueda acceder a ella desde cualquier lugar Jos da un mensaje como @Para un jugador@ o @He E a F $ugadores@, dependiendo de los valores min?num?jugadores # ma5?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 %a creado el juego Los datos generales (propios de la clase @soporte@) se muestran llamando al mismo m"todo de la clase @parent@ # el nDmero de jugadores disponibles se muestra con una llamada al m"todo imprime?jugadores?posibles() Podr&amos utili6ar un cdigo como el que sigue, si es que queremos comprobar que la clase

funciona correctamente # que nos ofrece la salida que est1bamos pensando +mijuego = ne< juego(@Rinal Rantas#@, FE, F 5, @Pla#station@,E,E), +mijuego0Bimprime?caracteristicas(), --esta l&nea dar&a un error porque no se permite acceder a un atributo private del objeto --ec%o @IbrB$ugadores( @ +mijuego0Bmin?num?jugadores, --%abria que crear un m"todo para que acceda a los atributos private +mijuego0Bimprime?jugadores?posibles(), ec%o @IpB@, +mijuegoF = ne< juego(@SP /otoracer@, F2, 3, @Pla#station 77@,E,F), ec%o @IbB@ +mijuegoF0Btitulo @I-bB@, +mijuegoF0Bimprime?jugadores?posibles(), 'ste cdigo que utili6a la clase @juego@ dar1 como salida( $uego para( Pla#station Rinal Rantas# F 5 (7A9 no incluido) Para un jugador Para un jugador SP /otoracer He E a F $ugadores /anual de PHP 5 0 /anual completo P1gina E2 de 34Los atributos de los objetos pueden ser otros objetos Las caracter&sticas de los objetos, que se almacenan por medio de los llamados atributos o propiedades, pueden ser de diversa naturale6a La clase %ombre puede tener distintos tipos de atributos, como la edad (num"rico), 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) )ambi"n puede tener una estatura o un peso (que podr&an ser de tipo float o nDmero en coma flotante) 'n general, podemos utili6ar cualquier tipo para los atributos de los objetos, incluso podemos utili6ar otros objetos Por ejemplo, podr&amos definir como atributo de la clase %ombre sus manos Hada la complejidad de las manos, estas podr&an definirse como otro objeto Por ejemplo, las manos tendr&an como caracter&sticas la longitud de los dedos, un coeficiente de elasticidad Como funcionalidades o m"todos, podr&amos definir agarrar algo, soltarlo, pegar una bofetada, o cortarse las u:as 9s& pues, uno de los atributos de la clase %ombre podr&a ser un nuevo objeto, con su propias caracter&sticas # funcionalidades La complejidad de las manos no le importa al desarrollador de la clase %ombre, por el principio de encapsulacin, dado que este conoce sus propiedades (o aquellas declaradas como public) # los m"todos (tambi"n los que se %a#an decidido declarar como pDblicos) # no necesita preocuparse sobre cmo se %an codificado Clase cliente del videoclub Para continuar el ejemplo del videoclub, %emos creado la clase cliente que vamos a e5plicar a continuacin 'n los clientes %emos definido como atributo, entre otros, las pel&culas o juegos alquilados La clase cliente que %emos creado tiene cierta complejidad, esperamos que no sea demasiada para que se pueda entender f1cilmente La e5plicaremos poco a poco para facilitar las cosas 9tributos de la clase cliente Hemos definido una serie de atributos para trabajar con los clientes )enemos los siguientes( public +nombre, private +numero, private +soportes?alquilados,

private +num?soportes?alquilados, private +ma5?alquiler?concurrente, Como se puede ver, se %an definido casi todos los atributos como private, con lo que slo se podr1n acceder dentro del cdigo de la clase 'l atributo nombre, que guarda el nombre propio del cliente, es el Dnico que %emos dejado como pDblico # que por tanto se podr1 referenciar desde cualquier parte del programa, incluso desde otras clases 'l atributo numero se utili6a para guardar el identificador num"rico del cliente Por su parte, soportes alquilados nos servir1 para asociar al cliente las pel&culas o juegos cuando este las alquile 'l atributo num?soportes?alquilados almacenar1 el nDmero de pel&culas o juegos que un cliente tiene alquilados en todo momento Por Dltimo, ma5?alquiler?concurrente indica el nDmero m15imo de soportes que puede tener alquilados un cliente en un mismo instante, no permiti"ndose alquilar a ese cliente, a la ve6, m1s que ese nDmero de pel&culas o juegos Jota(Como vemos, los objetos pueden tener algunos atributos tambi"n de tipo objeto 'n ese caso pueden %aber distintos tipos de relaciones entre objetos Por ejemplo, por pertenencia, como en el caso de la clase %ombre # sus manos, pues a un %ombre le pertenecen sus manos )ambi"n se pueden relacionar los objetos por asociacin, como es el caso de los clientes # las pel&culas que alquilan, pues en ese caso un cliente no tiene una pel&cula propiamente dic%a, sino que se asocia con una pel&cula moment1neamente /anual de PHP 5 0 /anual completo P1gina EC de 34'l Dnico atributo sobre el que merece la pena llamar la atencin es soportes?alquilados, que contendr1 un arra# de soportes 'n cada casilla del arra# se introducir1n las pel&culas o juegos que un cliente va#a alquilando, para asociar esos soportes al cliente que las alquil 'l arra# contendr1 tantas casillas como el ma5?alquiler?concurrente, puesto que no tiene sentido asignar ma#or espacio al arra# del que se va a utili6ar Para facilitar las cosas, cuando un cliente no tiene alquilado nada, tendr1 el valor null en las casillas del arra# Constructor de la clase cliente function ??construct(+nombre,+numero,+ma5?alquiler?concurrente=3)* +t%is0Bnombre=+nombre, +t%is0Bnumero=+numero, +t%is0Bsoportes?alquilados=arra#(), +t%is0Bnum?soportes?alquilados=N, +t%is0Bma5?alquiler?concurrente = +ma5?alquiler?concurrente, --iniciali6o las casillas del arra# de alquiler a @null@ --un valor @null@ quiere decir que el no %a# alquiler en esa casilla for (+i=N,+iI+ma5?alquiler?concurrente,+iPP)* +t%is0Bsoportes?alquiladosT+iU=null, . . 'l constructor de la clase cliente recibe los datos para iniciali6ar el objeto 'stos son +nombre, +numero # +ma5?alquiler?concurrente 8i nos fijamos, se %a definido por defecto a 3 el nDmero m15imo de alquileres que puede tener un cliente, de modo que, en el caso de que la llamada al constructor no env&e el par1metro +ma5?alquiler?concurrente se asumir1 el valor 3 'l atributo soportes?alquilados, como %ab&amos adelantado, ser1 un arra# que tendr1 tantas casillas como el m15imo de alquileres concurrentes 'n las Dltimas l&neas se iniciali6an a null el contenido de las casillas del arra#

Los atributos de los objetos pueden ser otros objetos, FV parte /"todo dame?numero() function dame?numero()* return +t%is0Bnumero, . 'ste m"todo simplemente devuelve el numero de identificacin del cliente Como se %a definido el atributo numero como private, desde fuera del cdigo de la clase, slo se podr1 acceder a este a trav"s del m"todo dame?numero() /"todo tiene?alquilado(+soporte) function tiene?alquilado(+soporte)* for (+i=N,+iI+t%is0Bma5?alquiler?concurrente,+iPP)* if (Wis?null(+t%is0Bsoportes?alquiladosT+iU))* if (+t%is0Bsoportes?alquiladosT+iU0Bdame?numero?identificacion() == +soporte0 Bdame?numero?identificacion())* return true, . . . --si esto# aqui es que no tiene alquilado ese soporte return false, . 'ste recibe un soporte # devuelve true si est1 entre los alquileres del cliente Hevuelve false en caso contrario Jota(Gecordemos que los soportes fueron definidos en cap&tulos anteriores de este manual de PHP 5 T%ttp(--<<< desarrollo<eb com-manuales-5C-U, mediante un mecanismo de %erencia 8oporte era una clase de la que %eredaban las pel&culas en HAH, las cintas de v&deo # los juegos /anual de PHP 5 0 /anual completo P1gina EM de 349 este m"todo lo llamamos desde dentro de la clase cliente, en la codificacin de otro m"todo Podr&amos %aber definido entonces el m"todo como private, si pens1semos que slo lo vamos a utili6ar desde dentro de esta clase 'n este caso lo %emos definido como public (el modificador por defecto) porque pensamos que puede ser Dtil para otras partes del programa 'ste m"todo recibe un soporte (cualquier tipo de soporte, tanto cintas de v&deo, como HAHs o juegos) Geali6a un recorrido por el arra# de soportes alquilados preguntando a cada soporte que tenga alquilado el cliente si su nDmero de identificacin es igual que el del soporte recibido por par1metro Como el nDmero de identificacin del soporte est1 definido como private en la clase soporte, para acceder a su valor tenemos que utili6ar el m"todo de soporte dame?numero?identificacin() Otra cosa importante Como no es seguro que en el arra# de soportes alquilados %a#a algDn soporte (recordamos que si el cliente no tiene nada alquilado las casillas est1n a null), antes de llamar a ningDn m"todo del soporte debemos comprobar que realmente e5iste 'sto se %ace con la funcin is?null() a la que le enviamos la casilla del arra# donde queremos comprobar si e5iste un soporte 8i la funcin is?null() devuelve true es que tiene almacenado el valor null, con lo que sabremos que no %a# soporte He manera contraria, si la casilla almacena un soporte, la funcin is?null() devolver1 false /"todo alquila(+soporte) function alquila(+soporte)* if (+t%is0Btiene?alquilado(+soporte))* ec%o @IpB'l cliente #a tiene alquilado el soporte IbB@ +soporte0Btitulo @I-bB@, .elseif (+t%is0Bnum?soportes?alquilados==+t%is0Bma5?alquiler?concurrente)*

ec%o @IpB'ste cliente tiene @ +t%is0Bnum?soportes?alquilados @ elementos alquilados @, ec%o @Jo puede alquilar m1s en este videoclub %asta que no devuelva algo@, .else* --miro en el arra# a ver donde tengo sitio para meter el soporte +cont = N, <%ile (Wis?null(+t%is0Bsoportes?alquiladosT+contU))* +contPP, . +t%is0Bsoportes?alquiladosT+contU=+soporte, +t%is0Bnum?soportes?alquiladosPP, ec%o @IpBIbB9lquilado soporte a( I-bB@ +t%is0Bnombre @IbrB@, +soporte0Bimprime?caracteristicas(), . . 'ste m"todo sirve para alquilar una pel&cula o juego por parte del cliente Gecibe el soporte a alquilar #, en caso que el alquiler se pueda producir, debe introducir el objeto soporte recibido en el arra# de soportes alquilados del cliente Lo primero que %ace es comprobar que el cliente no tiene alquilado ese mismo soporte, utili6ando el m"todo tiene?alquilado() de la clase soporte 8i no lo tiene alquilado comprueba que todav&a tiene capacidad para alquilar otro soporte, es decir, que no %a llegado al m15imo en el nDmero de soportes alquilados 8i se puede alquilar el soporte, lo introduce dentro del arra# soportes?alquilados en una posicin vac&a (una casilla donde antes %ubiera un null), incrementa en uno el nDmero de soportes alquilados e imprime las caracter&sticas del soporte que se %a alquilado /"todo devuelve(+identificador?soporte) function devuelve(+identificador?soporte)* if (+t%is0Bnum?soportes?alquilados==N)* ec%o @IpB'ste cliente no tiene alquilado ningDn elemento@, return false, . --recorro el arra# a ver si encuentro el soporte con identificador recibido for (+i=N,+iI+t%is0Bma5?alquiler?concurrente,+iPP)* if (Wis?null(+t%is0Bsoportes?alquiladosT+iU))* if (+t%is0Bsoportes?alquiladosT+iU0Bdame?numero?identificacion() == +identificador?soporte)* /anual de PHP 5 0 /anual completo P1gina FN de 34 ec%o @IpB8oporte devuelto( @ +identificador?soporte, ec%o @ IbB@ +t%is0Bsoportes?alquiladosT+iU0Btitulo @I-bB@, +t%is0Bsoportes?alquiladosT+iU=null, +t%is0Bnum?soportes?alquilados00, return true, . . . --si esto# aqui es que el cliente no tiene ese soporte alquilado ec%o @IpBJo se %a podido encontrar el soporte en los alquileres de este cliente@, return false, . 'l m"todo devuelve recibe el identificador del soporte que debe devolver el cliente Hevuelve true si se consigui devolver el soporte, false en caso contrario Lo primero que %ace es

comprobar si el cliente tiene alquilado algDn soporte, comprobando que la variable num?soportes?alquilados no sea cero Luego %ace un recorrido por el arra# de soportes alquilados para ver si encuentra el soporte que se desea devolver Para cada soporte alquilado (cada casilla del arra# que no contenga el valor null) comprueba si el identificador es el mismo que el recibido por par1metro Cuando encuentra el soporte, muestra un mensaje por pantalla # lo devuelve simplemente poniendo a null la casilla correspondiente del arra# soportes?alquilados # decrementando en uno el atributo num?soportes?alquilados 8i se encuentra el soporte, se sale de la funcin devolviendo true Por lo que, si no se %a salido de la funcin despu"s de %acer el recorrido por el arra#, sabemos que no se %a encontrado ese soporte 'ntonces mostramos un mensaje en pantalla # devolvemos false /"todo lista?alquileres() function lista?alquileres()* if (+t%is0Bnum?soportes?alquilados==N)* ec%o @IpB'ste cliente no tiene alquilado ningDn elemento@, .else* ec%o @IpBIbB'l cliente tiene @ +t%is0Bnum?soportes?alquilados @ soportes alquiladosI-bB@, --recorro el arra# para listar los elementos que tiene alquilados for (+i=N,+iI+t%is0Bma5?alquiler?concurrente,+iPP)* if (Wis?null(+t%is0Bsoportes?alquiladosT+iU))* ec%o @IpB@, +t%is0Bsoportes?alquiladosT+iU0Bimprime?caracteristicas(), . . . . 'ste m"todo %ace un recorrido por el arra# de soportes alquilados # muestra las caracter&sticas de cada soporte Comprueba que el cliente tiene algo alquilado antes de %acer el recorrido Gecordar siempre, antes de llamar a un m"todo del soporte almacenado en cada casilla del arra#, comprobar que el contenido de esa casilla no es null /"todo imprime?caracteristicas() function imprime?caracteristicas()* ec%o @IpBIbBCliente @ +t%is0Bnumero @(I-bB @ +t%is0Bnombre, ec%o @IbrB9lquileres actuales( @ +t%is0Bnum?soportes?alquilados . 8implemente muestra algunos de los datos del cliente 's un m"todo para obtener algDn dato por pantalla de un cliente Comprobar el funcionamiento de la clase cliente 's importante se:alar que, para que la clase cliente funcione, debe disponer de los cdigos de /anual de PHP 5 0 /anual completo P1gina FE de 34las distintas clases de las que %ace uso (la clase soporte, cinta?video, juego # dvd) 'stos cdigos se pueden %aber escrito en el mismo arc%ivo o bien incluirse con unas instrucciones como estas( include @soporte p%p@, include @dvd p%p@, include @juego p%p@, include @cinta?video p%p@, La clase cliente se puede poner en funcionamiento, para probar su correcta implementacin, con un cdigo como este(

--instanciamos un par de objetos cliente +clienteE = ne< cliente(@Pepe@, E), +clienteF = ne< cliente(@Goberto@, 54>), --mostramos el numero de cada cliente creado ec%o @'l identificador del cliente E es( @ +clienteE0Bdame?numero(), ec%o @IbrB'l identificador del cliente F es( @ +clienteF0Bdame?numero(), --instancio algunos soportes +soporteE = ne< cinta?video(@Los Otros@, E, 3 5, @EE5 minutos@), +soporteF = ne< juego(@Rinal Rantas#@, F, F 5, @Pla#station@,E,E), +soporte3 = ne< dvd(@Los 7ntocables@, 3, 3, @7ngl"s # espa:ol@,@E4(M@), +soporte> = ne< dvd(@'l 7mperio Contraataca@, >, 3, @7ngl"s # espa:ol@,@E4(M@), --alquilo algunos soportes +clienteE0Balquila(+soporteE), +clienteE0Balquila(+soporteF), +clienteE0Balquila(+soporte3), --vo# a intentar alquilar de nuevo un soporte que #a tiene alquilado +clienteE0Balquila(+soporteE), --el cliente tiene 3 soportes en alquiler como m15imo --este soporte no lo va a poder alquilar +clienteE0Balquila(+soporte>), --este soporte no lo tiene alquilado +clienteE0Bdevuelve(>), --devuelvo un soporte que s& que tiene alquilado +clienteE0Bdevuelve(F), --alquilo otro soporte +clienteE0Balquila(+soporte>), --listo los elementos alquilados +clienteE0Blista?alquileres(), La ejecucin de este cdigo, si todo funciona correctamente, deber&a devolvernos como resultado esta salida( 'l identificador del cliente E es( E 'l identificador del cliente F es( 54> 9lquilado soporte a( Pepe Pel&cula en AH8( Los Otros 3 5 (7A9 no incluido) Huracin( EE5 minutos 9lquilado soporte a( Pepe $uego para( Pla#station Rinal Rantas# F 5 (7A9 no incluido) Para un jugador 9lquilado soporte a( Pepe /anual de PHP 5 0 /anual completo P1gina FF de 34Pel&cula en HAH( Los 7ntocables 3 (7A9 no incluido) 7ngl"s # espa:ol 'l cliente #a tiene alquilado el soporte Los Otros 'ste cliente tiene 3 elementos alquilados Jo puede alquilar m1s en este videoclub %asta que no

devuelva algo Jo se %a podido encontrar el soporte en los alquileres de este cliente 8oporte devuelto( F Rinal Rantas# 9lquilado soporte a( Pepe Pel&cula en HAH( 'l 7mperio Contraataca 3 (7A9 no incluido) 7ngl"s # espa:ol 'l cliente tiene 3 soportes alquilados Pel&cula en AH8( Los Otros 3 5 (7A9 no incluido) Huracin( EE5 minutos Pel&cula en HAH( 'l 7mperio Contraataca 3 (7A9 no incluido) 7ngl"s # espa:ol Pel&cula en HAH( Los 7ntocables 3 (7A9 no incluido) 7ngl"s # espa:ol Gepasando la creacin de clases Para continuar la creacin del videoclub # las e5plicaciones sobre la programacin orientada a objetos (POO), vamos a programar la clase principal, que engloba a todas las clases que %emos ido creando %asta el momento La clase principal se llama videoclub # modela el comportamiento general del videoclub Llegado este punto ser&a bueno que remarcar dos cosas sobre el desarrollo de programas orientados a objetos E La clase principal de un sistema que deseamos modelar en POO se suele llamar como el propio sistema que estamos modelando Por ejemplo, si estuvi"ramos creando una biblioteca, la clase principal se llamar&a biblioteca 'n este caso, que estamos %aciendo un videoclub, la clase principal se llamar1 videoclub F 'l proceso de creacin de un programa POO se reali6a al rev"s de como %emos %ec%o en este manual, empe6ando el desarrollo de la clase general # finali6ando por las clases m1s espec&ficas He este modo, al crear la clase general, podemos ir viendo qu" otros objetos necesitaremos, cu1les ser1n sus m"todos # propiedades 'n este manual lo %emos %ec%o al rev"s porque nos ven&a bien para ir describiendo las caracter&sticas de la POO La clase videoclub tendr1 como propiedades a los soportes en alquiler (pel&culas o juegos) # por otra parte, los socios o clientes que alquilan los productos Los m"todos de la clase videoclub /anual de PHP 5 0 /anual completo P1gina F3 de 34ser1n la inclusin # listado de soportes en alquiler # de socios, el alquiler de soportes por parte de clientes Aamos #a con el cdigo # sus e5plicaciones 9tributos de la clase videoclub public +nombre, private +productos, private +num?productos, private +socios, private +num?socios,

'l atributo +productos ser1 un arra# con los distintos soportes en alquiler +num?productos lo utili6aremos para llevar la cuenta del nDmero de productos que tenemos disponibles He modo similar, +socios ser1 un arra# de clientes # +num?socios llevar1 la cuenta de los socios que tenemos dados de alta 9parte, nuestro videoclub tendr1 un nombre, que almacenaremos en la variable +nombre Constructor function ??construct(+nombre)* +t%is0Bnombre=+nombre, +t%is0Bproductos=arra#(), +t%is0Bnum?productos=N, +t%is0Bsocios=arra#(), +t%is0Bnum?socios=N, . 'ste m"todo iniciali6ar1 los atributos del objeto que se est1 constru#endo Gecibe Dnicamente el nombre del videoclub Como tareas destacables est1n las iniciali6aciones de los arra#s de productos # socios # la puesta a cero de los contadores que vamos a utili6ar /"todo incluir?producto() private function incluir?producto(+nuevo?producto)* +t%is0BproductosT+t%is0Bnum?productosU=+nuevo?producto, ec%o @IpB7ncluido soporte @ +t%is0Bnum?productos, +t%is0Bnum?productosPP, . 'ste m"todo %a sido declarado como private, porque slo queremos que se llame desde dentro de la clase Gecibe el nuevo producto que se quiere dar de alta # lo guardar en el arra# de productos, en la posicin marcada por el atributo num?productos Luego muestra un mensaje por pantalla # por Dltimo incrementa a uno el atributo num?productos /"todos incluir?dvd(),incluir?cinta?video() e incluir?juego() Los tres siguientes m"todos que vamos a ver, instancian los tres productos con los que trabaja el videoclub # luego los introducen en arra# de productos llamando a incluir?producto() function incluir?dvd(+tit,+precio,+idiomas,+pantalla)* +dvd?nuevo = ne< dvd(+tit, +t%is0Bnum?productos, +precio, +idiomas, +pantalla), +t%is0Bincluir?producto(+dvd?nuevo), . function incluir?cinta?video(+tit,+precio,+duracion)* +cinta?video?nueva = ne< cinta?video(+tit, +t%is0Bnum?productos, +precio, +duracion), +t%is0Bincluir?producto(+cinta?video?nueva), . Jota(Ji que decir tiene que el videoclub que estamos creando est1 simplificado al m15imo 'st1 claro que si estuvi"semos creando un videoclub con el propsito de utili6arlo en produccin, %abr&a que pensar # desarrollar muc%as otras funcionalidades /anual de PHP 5 0 /anual completo P1gina F> de 34function incluir?juego(+tit,+precio,+consola, +min?j,+ma5?j)* +juego?nuevo = ne< juego(+tit, +t%is0Bnum?productos, +precio, +consola, +min?j, +ma5?j), +t%is0Bincluir?producto(+juego?nuevo), . Podemos fijarnos que el nDmero de identificacin del soporte, que recibe el constructor de las cintas de v&deo, HAHs o juegos, lo generamos por medio del atributo de la clase de videclub num?productos, que guarda el nDmero de productos dados de alta

/"todo incluir?socio() 'ste m"todo %ace las tareas de instanciacin del socio nuevo # su inclusin en el arra# de socios function incluir?socio(+nombre,+ma5?alquiler?concurrente=3)* +socio?nuevo = ne< cliente(+nombre,+t%is0Bnum?socios,+ma5?alquiler?concurrente), +t%is0BsociosT+t%is0Bnum?sociosU=+socio?nuevo, ec%o @IpB7ncluido socio @ +t%is0Bnum?socios, +t%is0Bnum?sociosPP, . Geciben los datos del nuevo socio( nombre # el m15imo nDmero de pel&culas que puede alquilar (siendo 3 el valor por defecto) !na ve6 instanciado el nuevo socio, lo introduce en el arra#, en la posicin marcada por el atributo num?socios Luego muestran un mensaje por pantalla # por Dltimo incrementan a uno los atributos num?productos o num?socios 'l nDmero de socio, que recibe entre otros par1metros, el constructor de la clase socio lo generamos por medio del contador de socios num?socios, de la clase videclub /"todos listar?productos() # listar?socios() Hos m"todos mu# similares, que veremos de una sola ve6 function listar?productos()* ec%o @IpBListado de los @ +t%is0Bnum?productos @ productos disponibles(@, for (+i=N,+iI+t%is0Bnum?productos,+iPP)* ec%o @IpB@, +t%is0BproductosT+iU0Bimprime?caracteristicas(), . . function listar?socios()* ec%o @IpBListado de +t%is0Bnum?socios socios del videoclub(@, for (+i=N,+iI+t%is0Bnum?socios,+iPP)* ec%o @IpB@, +t%is0BsociosT+iU0Bimprime?caracteristicas(), . . 'stos m"todos imprimen un listado completo de los socios # productos dados de alta 8implemente %acen un recorrido del arra# de productos o de socios # van imprimiendo sus caracter&sticas /"todo alquila?a?socio() Geali6a las acciones necesarias para alquiler un producto a un socio function alquila?a?socio(+numero?socio,+numero?producto)* if (is?null(+t%is0BsociosT+numero?socioU))* ec%o @IpBJo e5iste ese socio@, .elseif(is?null(+t%is0BproductosT+numero?productoU))* ec%o @IpBJo e5iste ese soporte@, .else* +t%is0BsociosT+numero?socioU0Balquila(+t%is0BproductosT+numero?productoU), . . /anual de PHP 5 0 /anual completo P1gina F5 de 34'ste m"todo recibe el identificador del socio # del producto en alquiler 9ntes de proceder, reali6a un par de comprobaciones La primera para ver si e5iste un socio con el nDmero de socio indicado por par1metro # la segunda para ver si tambi"n e5iste un producto con el nDmero de

producto dado 8i todo fue bien, llama al m"todo alquila() del socio, envi1ndole el producto que desea alquilar Para probar la clase videoclub podr&amos utili6ar un cdigo como este( +vc = ne< videoclub(@La 'liana Aideo@), --vo# a incluir unos cuantos soportes de prueba +vc0Bincluir?juego(@Rinal Rantas#@, F 5, @Pla#station@,E,E), +vc0Bincluir?juego(@SP /otoracer@, 3, @Pla#station 77@,E,F), +vc0Bincluir?dvd(@Los Otros@, > 5, @7ngl"s # espa:ol@,@E4(M@), +vc0Bincluir?dvd(@Ciudad de His@, 3, @Portugu"s, ingl"s # espa:ol@,@E4(M@), +vc0Bincluir?dvd(@Los Picapiedra@, 3, @'spa:ol@,@E4(M@), +vc0Bincluir?cinta?video(@Los Otros@, > 5, @EE5 minutos@), +vc0Bincluir?cinta?video(@'l nombre de la Gosa@, E 5, @E>N minutos@), --listo los productos +vc0Blistar?productos(), --vo# a crear algunos socios +vc0Bincluir?socio(@$os" Ruentes@), +vc0Bincluir?socio(@Pedro Sarc&a@,F), +vc0Balquila?a?socio(E,F), +vc0Balquila?a?socio(E,3), --alquilo otra ve6 el soporte F al socio E -- no debe dejarme porque #a lo tiene alquilado +vc0Balquila?a?socio(E,F), --alquilo el soporte 4 al socio E --no se puede porque el socio E tiene F alquileres como m15imo +vc0Balquila?a?socio(E,4), --listo los socios +vc0Blistar?socios(), 8e %ace una carga de datos # una llamada a todos los m"todos que %emos visto para el videoclub 'ste cdigo dar1 como resultado una salida como la siguiente( 7ncluido soporte N 7ncluido soporte E 7ncluido soporte F 7ncluido soporte 3 7ncluido soporte > 7ncluido soporte 5 7ncluido soporte 4 Listado de los 2 productos disponibles( $uego para( Pla#station Rinal Rantas# F 5 (7A9 no incluido) Para un jugador Jota('l m"todo alquila() del socio tiene cierta complejidad, pero #a la vimos cuando e5plicamos la clase socio 'n este momento, por el principio de encapsulacin de la POO, debemos abstraernos de su dificultad # no prestarle atencin porque sabemos que funciona # no nos debe preocupar cmo lo %ace /anual de PHP 5 0 /anual completo P1gina F4 de 34$uego para( Pla#station 77 SP /otoracer 3 (7A9 no incluido)

He E a F $ugadores Pel&cula en HAH( Los Otros > 5 (7A9 no incluido) 7ngl"s # espa:ol Pel&cula en HAH( Ciudad de His 3 (7A9 no incluido) Portugu"s, ingl"s # espa:ol Pel&cula en HAH( Los Picapiedra 3 (7A9 no incluido) 'spa:ol Pel&cula en AH8( Los Otros > 5 (7A9 no incluido) Huracin( EE5 minutos Pel&cula en AH8( 'l nombre de la Gosa E 5 (7A9 no incluido) Huracin( E>N minutos 7ncluido socio N 7ncluido socio E 9lquilado soporte a( Pedro Sarc&a Pel&cula en HAH( Los Otros > 5 (7A9 no incluido) 7ngl"s # espa:ol 9lquilado soporte a( Pedro Sarc&a Pel&cula en HAH( Ciudad de His 3 (7A9 no incluido) Portugu"s, ingl"s # espa:ol 'l cliente #a tiene alquilado el soporte Los Otros 'ste cliente tiene F elementos alquilados Jo puede alquilar m1s en este videoclub %asta que no devuelva algo Listado de F socios del videoclub( Cliente N( $os" Ruentes 9lquileres actuales( N Cliente E( Pedro Sarc&a 9lquileres actuales( F /anual de PHP 5 0 /anual completo P1gina F2 de 34Hasta aqu& %a llegado por a%ora el desarrollo de este videoclub, que no es mu# funcional pero esperamos que %a#a servido para empe6ar a conocer las caracter&sticas de la programacin orientada a objetos 'n adelante, seguiremos este manual comentando otras particularidades de la POO en PHP 5, que tambi"n %a# que conocer /"todos # clases abstractos en PHP 5 !na clase abstracta es la que tiene m"todos abstractos Los m"todos abstractos son los que

est1n declarados en una clase, pero no se %a definido en la clase el cdigo de esos m"todos 'sa puede ser una buena definicin de clases # m"todos abstractos, pero veamos con calma una e5plicacin un poco m1s detallada # comprensible por todos 'n ocasiones, en un sistema de %erencia como el de la programacin orientada a objetos (POO), tenemos entidades que declarar aunque no se puede dar su definicin todav&a, simplemente las deseamos definir por encima para empe6ar una jerarqu&a de clases Pensemos en los productos l1cteos (los derivados de la lec%e) Jo cabe duda que los productos l1cteos son una gran familia 7nclu#en a los #ogures, mantequillas, quesos, %elados e incluso a la propia lec%e 8in embargo, los productos l1cteos en si no se encuentran en la vida real 'n el supermercado no te venden un producto l1cteo en general Por ejemplo, nadie compra un Xilo de producto l1cteo m1s bien preguntar1n por un litro de lec%e, un litro de %elado o un pacX de #ogures )odos los productos l1cteos tienen algunas caracter&sticas comunes, como el porcentaje en lec%e o la fec%a de caducidad )ambi"n tienen algunas funcionalidades comunes como conservarse o consumirse 8in embargo, la manera de conservarse es distinta dependiendo del producto l1cteo La lec%e se conserva fuera de la nevera, mientras que no est" abierto el bricX, # los #ogures 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 %elados, se deben conservar en el congelador, siempre que deseemos que no se conviertan en l&quido 9l consumir un producto l1cteo la cosa tambi"n cambia, puesto que el queso se suele acompa:ar con pan o tostadas, la lec%e se bebe # el %elado se toma con cuc%ara 'n definitiva, a donde queremos demostrar es que podemos tener un conjunto de objetos que tienen unas caracter&sticas comunes # funcionalidades, tambi"n comunes, pero que difieren en la manera de llevarlas a cabo Para esto est1 la abstraccin La clase de los productos l1cteos, tendr1 una serie de propiedades # unos m"todos abstractos Los m"todos abstractos, como %ab&amos adelantado, son aquellos que no inclu#en una codificacin, sino que simplemente se declaran, dejando para las clases que %ereden la tarea de codificarlos 'n este caso, la clase producto l1cteo tendr1 los m"todos abstractos conservarse() # consumirse(), pero no se especificar1 el cdigo fuente de estos m"todos (por eso son abstractos) Las clases que %ereden de producto l1cteo ser1n las encargadas de definir un cdigo para los m"todos definidos como abstractos en la clase padre 9s&, cada clase que %erede de producto l1cteo, deber1 especificar el mecanismo concreto # espec&fico por el cual se van a conservar o consumir Las clases que incorporan m"todos abstractos se deben declarar como abstractas 's una condicin for6osa Las clases abstractas no se pueden instanciar 's decir, no podemos crear objetos a partir de ellas 's algo lgico Pensemos en los productos l1cteos, estos no e5isten m1s que como una idea general 8lo podremos encontrar productos l1cteos de un tipo en /anual de PHP 5 0 /anual completo P1gina FC de 34concreto, como lec%e o #ogur, pero no la idea de producto l1cteo en general !na clase que %erede de un producto l1cteo debe definir los m"todos abstractos declarados en la clase abstracta He lo contrario, la clase que %ereda estar&a obligada a declararse como abstracta 'n nuestro ejemplo de videoclub, tratado a lo largo de los distintos cap&tulos del manual de PHP 5, tenemos una clase que tambi"n ser&a un buen ejemplo de clase abstracta 8e trata de la clase soporte He esta clase %eredaban los distintos productos del videoclub, como pel&culas en HAH, cintas de v&deo o juegos Jo %ubiera sido mala idea declarar como abstracta la clase soporte, dado que no se van a utili6ar, ni e5isten, soportes en general, sino que lo que e5isten

son los distintos soportes concretos La sinta5is de la abstraccin Para declarar clases # m"todos abstractos se utili6a la siguiente sinta5is abstract class nombre?clase* --propiedades public 5, private #, --m"todos public function ??construct()* Y . public abstract function nombre?metodo(), . Jos fijamos que se utili6a la palabra clave @abstract@ para definir las clases o m"todos abstractos 9dem1s, los m"todos abstractos no llevan ningDn cdigo asociado, ni siquiera las llaves para abrir # cerrar el m"todo 7nterfaces en PHP 5 Las interfaces son un sistema bastante comDn, utili6ado en programacin orientada a objetos 8on algo as& como declaraciones de funcionalidades que tienen que cubrir las clases que implementan las interfaces 'n una interfa6 se definen %abitualmente un juego de funciones que deben codificar las clases que implementan dic%a interfa6 He modo que, cuando una clase implementa una interfa6, podremos estar seguros que en su cdigo est1n definidas las funciones que inclu&a esa interfa6 9 la %ora de programar un sistema, podemos contar con objetos que son mu# diferentes # que por tanto no pertenecen a la misma jerarqu&a de %erencia, pero que deben reali6ar algunas acciones comunes Por ejemplo, todos los objetos con los que comercia unos grandes almacenes deben contar con la funcionalidad de venderse !na mesa tiene poco en comDn con un calefactor o unas 6apatillas, pero todos los productos disponibles deben implementar una funcin para poder venderse Otro ejemplo !na bombilla, un coc%e # un ordenador son clases mu# distintas que no pertenecen al mismo sistema de %erencia, pero todas pueden encenderse # apagarse 'n este caso, podr&amos construir una interfa6 llamada @encendible@, que incluir&a las funcionalidades de encender # apagar 'n este caso, la interfa6 contendr&a dos funciones o m"todos, uno encender () # otro apagar() /anual de PHP 5 0 /anual completo P1gina FM de 34Cuando se define una interfa6, se declaran una serie de m"todos o funciones sin especificar ningDn cdigo fuente asociado Luego, las clases que implementen esa interfa6 ser1n las encargadas de proporcionar un cdigo a los m"todos que contiene esa interfa6 'sto es seguro( si una clase implementa una interfa6, deber&a declarar todos los m"todos de la interfa6 8i no tenemos cdigo fuente para alguno de esos m"todos, por lo menos debemos declararlos como abstractos #, por tanto, la clase tambi"n tendr1 que declararse como abstracta, porque tiene m"todos abstractos Cdigo para definir una interfa6 Aeamos el cdigo para reali6ar una interfa6 'n concreto veremos el cdigo de la interfa6 encendible, que tienen que implementar todas las clases cu#os objetos se puedan encender # apagar interface encendible* public function encender(), public function apagar(),

. Aemos que para definir una interfa6 se utili6a la palabra clave interface, seguida por el nombre de la interfa6 #, entre llaves, el listado de m"todos que tendr1 Los m"todos no se deben codificar, sino Dnicamente declararse 7mplementacin de interfaces 9%ora veamos el cdigo para implementar una interfa6 en una clase class bombilla implements encendible* public function encender()* ec%o @IbrB; la lu6 se %i6o @, . public function apagar()* ec%o @IbrB'stamos a oscuras @, . . Para implementar una interfa6, en la declaracin de la clase, se debe utili6ar la palabra implements, seguida del nombre de la interfa6 que se va a implementar 8e podr&an implementar varias interfaces en la misma clase, en cu#o caso se indicar&an todos los nombres de las interfaces separadas por comas 'n el cdigo de la clase estamos obligados a declarar # codificar todos los m"todos de la interfa6 9%ora veamos el cdigo de la clase coc%e, que tambi"n implementa la interfa6 encendible 'ste cdigo lo %emos complicado un poco m1s class coc%e implements encendible* private +gasolina, private +bateria, private +estado = @apagado@, function ??construct()* +t%is0Bgasolina = N, +t%is0Bbateria = EN, Jota( en concreto, PHP 5 entiende que si una clase implementa una interfa6, los m"todos de esa interfa6 estar1n siempre en la clase, aunque no se declaren He modo que si no los declaramos e5pl&citamente, PHP 5 lo %ar1 por nosotros 'sos m"todos de la interfa6 ser1n abstractos, as& que la clase tendr1 que definirse como abstracta 8e puede encontrar m1s informacin sobre la abstraccin en el art&culo /"todos # clases abstractos en PHP 5 T%ttp(--<<< desarrollo<eb com-articulos-FEN3 p%pU /anual de PHP 5 0 /anual completo P1gina 3N de 34 . public function encender()* if (+t%is0Bestado == @apagado@)* if (+t%is0Bbateria B N)* if (+t%is0Bgasolina B N)* +t%is0Bestado = @encendido@, +t%is0Bbateria 00, ec%o @IbrBIbB'nciendo I-bB esto# encendidoW@, .else* ec%o @IbrBJo tengo gasolina@, . .else* ec%o @IbrBJo tengo bater&a@,

. .else* ec%o @IbrB;a estaba encendido@, . . public function apagar()* if (+t%is0Bestado == @encendido@)* +t%is0Bestado = @apagado@, ec%o @IbrBIbB9pago I-bB esto# apagadoW@, .else* ec%o @IbrB;a estaba apagado@, . . public function cargar?gasolina(+litros)* +t%is0Bgasolina P= +litros, ec%o @IbrBCargados +litros litros@, . . 9 la vista del anterior cdigo, se puede comprobar que no %a# muc%o en comDn entre las clases bombilla # coc%e 'l cdigo para encender una bombilla era mu# simple, pero para poner en marc%a un coc%e tenemos que reali6ar otras tareas 9ntes tenemos que ver si el coc%e estaba encendido previamente, si tiene gasolina # si tiene bater&a Por su parte, el m"todo apagar %ace una Dnica comprobacin para ver si estaba o no el coc%e apagado previamente )ambi"n %emos incorporado un constructor que iniciali6a los atributos del objeto Cuando se constru#e un coc%e, la bater&a est1 llena, pero el depsito de gasolina est1 vac&o Para llenar el depsito simplemente se debe utili6ar el m"todo cargar?gasolina() Llamadas polimrficas pasando objetos que implementan una interfa6 Las interfaces permiten el tratamiento de objetos sin necesidad de conocer las caracter&sticas internas de ese objeto # sin importar de qu" tipo son simplemente tenemos que saber que el objeto implementa una interfa6 Por ejemplo, tanto los coc%es como las bombillas se pueden encender # apagar 9s& pues, podemos llamar al m"todo encender() o apagar(), sin importarnos si es un coc%e o una bombilla lo que %a# que poner en marc%a o detener 'n la declaracin de una funcin podemos especificar que el par1metro definido implementa una interfa6, de modo que dentro de la funcin, se pueden reali6ar acciones teniendo en cuenta que el par1metro recibido implementa un juego de funciones determinado Por ejemplo, podr&amos definir una funcin que recibe algo por par1metro # lo enciende 'specificaremos que ese algo que recibe debe de implementar la interfa6 encendible, as& podremos llamar a sus m"todos enciende() o apaga() con la seguridad de saber que e5isten function enciende?algo (encendible +algo)* +algo0Bencender(), /anual de PHP 5 0 /anual completo P1gina 3E de 34. +mibombilla = ne< bombilla(), +micoc%e = ne< coc%e(), enciende?algo(+mibombilla), enciende?algo(+micoc%e), 8i tuvi"ramos una clase que no implementa la interfa6 encendible, la llamada a esta funcin provocar&a un error Por ejemplo, un CH0Gom no se puede encender ni apagar class cd*

public +espacio, . +micd = ne< cd(), enciende?algo(+micd), --da un error cd no implementa la interfa6 encendible 'sto nos dar&a un error como este( Ratal error( 9rgument E must implement interface encendible in c(Z<<<Zejp%p5Zfuncion?encender p%p on line 4 [ueda mu# claro que deber&amos implementar la interfa6 encendible en la clase cd para que la llamada a la funcin se ejecute correctamente 'legir entre PHP> # PHP5 Conviene la migracin\ Las dudas b1sicamente circulan siempre el mismo camino, # ambas elecciones tienen sus ventajas # desventajas 7ntentaremos en este informe orientar a los desarrolladores a decidirse por una u otra alternativa 's importante remarcar antes de ubicarse de lleno en el an1lisis de las ventajas # desventajas de una u otra opcin, las principales diferencias e5istentes entre ambas versiones, cuales son los cambios que repercuten m1s fuertemente en la compatibilidad de los scripts, # que es lo que nos depara el futuro en toda esta %istoria Cambios profundos La llegada de PHP5 vino emparejada de una reestructuracin del Core de PHP, lo que los creadores de PHP llama ]end 'ngine 9s& como el lejano PHP3 inclu#e su ]end 'ngine T%ttp(--<<< 6end com-p%p5-6end0engineF p%pU N 5, # PHP> el ]end 'ngine E N, tenemos ]end 'ngine F N en PHP5 'l cambio de versin no fue trivial, inclu#e la reescritura casi total del modelo de objetos, entre sus cambios m1s sustanciales 'sto repercute directamente en los scripts de PHP> que utili6an clases, tanto en la compatibilidad como en performance de ejecucin Posteriormente en este art&culo nos referiremos nuevamente a este tema Aeamos un ejemplo que nos muestra un cambio sustancial en la implementacin del modelo de objetos( I\ class Persona * function setJombre(+nombre) * +t%is0Bnombre = +nombre, . function getJombre() * return +t%is0Bnombre, . . function 9lgo(+p) * +persona0BsetJombre(@Haniel@), . /anual de PHP 5 0 /anual completo P1gina 3F de 34E +persona = ne< Persona(), F +persona0BsetJombre(@Pic%ongol@), 3 9lgo(+persona), > ec%o +persona0BgetJombre(), \B ^Cu1l es el problema en este cdigo corriendo en PHP>\ 'n la l&nea E instanciamos un objeto de la clase Persona Luego le decimos que se llama Haniel

'l error de implementacin viene con la l&nea 3 'l argumento +p que recibe 9lgo, no es mas que una copia de +persona, # eso esta /9L ^Porque\, m&nimamente por F ra6ones La primera ra6n es que esta estrategia es POO0Jo compatible Claramente cuando %ablamos del Paradigma Orientado a Objetos, estamos casi descartando que cada objeto sea referenciado por su 7dentificador 8in embargo, el ]end 'ngine E N no est1 preparado para dic%a accin( I\ function ejemplo(+val)* ec%o +val, . +cadena = @te5to@, ejemplo(+cadena), \B La variable +cadena pasada como argumento a la funcin ejemplo, es copiada para su uso local dentro de dic%a funcin 's lo que se conoce como paso de par1metros por valor 'l ]end 'ngine E N %ace e5actamente esto para todas las funciones, inclusive para las que est1n dentro de una clase, las cuales en ese caso actDan como m"todos( I\ function 9lgo(+persona) * +persona0BsetJombre(@Haniel@), . \B, Aolviendo al ejemplo inicial de la clase persona, el m"todo 9lgo recibe una copia (un clon) del objeto Persona La segunda ra6n viene emparejada con la primera, siendo consecuencia de esta Cualquier modificacin del objeto Persona que se produ6ca dentro del m"todo 9lgo, solo tendr1 alcance local, # no se ver1 reflejado cuando la funcin retorne I\ 9lgo(+persona), ec%o +persona0BgetJombre(), \B 'n ese caso la modificacin del nombre que %ace la funcin 9lgo al objeto Persona no se ve reflejada cuando %acemos ec%o +persona0BgetJombre() 'n nuestro bro<ser veremos @Pic%ongol@ 'ste es solo un ejemplo del porque de la reestructuracin tan importante en el Core de PHP 's claro que toda reestructuracin barre con cuestiones de compatibilidad, para ganar en otros sXills, en este caso claramente estamos ganando en performance, al liberarnos del over%ead que implica la constante copia de objetos que son argumentos de m"todos # funciones 'n art&culos posteriores trataremos en ma#or detalle # profundidad los distintos aspectos que fueron modificados, %aciendo una comparativa entre como se logran en PHP> # como se logran en PHP5 9dem1s de e5plicar profundamente las diferencias en el modelo de objetos nos quedan temas pendientes como Opciones de configuracin (p%p ini), Cone5in a /#8[L T%ttp(--<<< m#sql com-U (m#sqli), cambios en los mdulos, etc Hec%a esta introduccin, estamos en condiciones de definir las distintas situaciones en las que /anual de PHP 5 0 /anual completo P1gina 33 de 34se puede encontrar el desarrollador, # que aspectos juegan a su favor o en contra segDn la situacin en la que se encuentre ^Cual es mi escenario\ 'n el momento de plantearse la pregunta, el desarrollador seguramente se ubicar1 en alguno

de los dos escenarios posibles( @ Je<bie (7niciacin en PHP) @ '5perimentado Je<bie 'n el planteo de esta discusin, podr&amos decir que es la situacin ideal, o por lo menos la m1s beneficiosa 8i eres una persona que quiere arrancar en PHP, no lo dudes, PHP5 es para ti )us aplicaciones go6aran de las nuevas capacidades en OOP, obtendr1s el beneficio de una mejor performance de ejecucin (esta comprobado e5perimentalmente que PHP5 corre un F5Q m1s r1pido que PHP>) # tu cdigo estar1 mu# bien acondicionado en cuanto a la compatibilidad con el nuevo %ijo que asoma( PHP4 Por cierto, no todo es color de rosas !na de los ma#ores beneficios a la %ora de elegir PHP para trabajar en nuestro pro#ecto es la gran cantidad de cdigo que podemos encontrar en 7nternet, # utili6arlo para nuestros trabajos )enemos una gran probabilidad de que ante alguna tarea que se nos plantea, podamos encontrar algDn script que nos solucione la vida, obviamente adapt1ndolo a nuestras necesidades 9%ora bien, no todo el cdigo que vamos a encontrar es compatible con PHP5 He %ec%o la gran ma#or&a todav&a no se %a adaptado 's cierto que con algDn setting en nuestro p%p ini podemos a#udar a darle ma#or compatibilidad, pero como contrapartida muc%as de estas settings se eliminaran en PHP4 ^[u" queda\ Hacerlo compatible modificando el cdigo, una tarea que para un desarrollador que se inicia no siempre es sencillo He todas formas a no alarmarse, que los grandes pro#ectos (PHPJuXe T%ttp(--<<< p%pnuXe com-U, PHP__ T%ttp(--<<< p%pbb com-U, etc ) ofrecen compatibilidad '5perimentado 'n este caso, el optar por quedarse con PHP> o pasar a PHP5 depende de nuestra aplicacin Las interrogantes que el desarrollador se puede plantear podr&an ser( 0 ^/i aplicacin usa clases # objetos\ 0 ^/i motor de _ase de datos es /#8[L\ 0 ^!tili6o un %osting e5terno\ 0 ^/i aplicacin sufre modificaciones en cuanto a los requerimientos # lgica de negocios\ Pasemos a discutir ventajas # desventajas en cada uno de los interrogantes( ^/i aplicacin usa clases # objetos\ Como pudimos comprender al comien6o de este articulo, uno de los principales esfuer6os de los dise:adores del ]end 'ngine radic en el mejoramiento del modelo de objetos, bas1ndose claramente en un referente indiscutible en esta materia como lo es 8un T%ttp(--<<< sun com-U 8alvando las diferencias, se %an tomado muc%as cosas de $ava T%ttp(--java sun com-U, desde convenciones de nomenclaturas %asta estrategias de implementacin 8eria un desperdicio no utili6ar dic%o esfuer6o, sobre todo si nuestra aplicacin %ace un uso e5%austivo de clases # objetos ^/i motor de _ase de datos es /#8[L\ 9 diferencia de la estrategia de PHP> para la conectividad PHP-/#8[L, en la que el Core de PHP nos provee de un set de funciones para dic%a interaccin, en PHP5 /#8[L nos provee de un 9P7 e5terno _1sicamente, la ra6n de este cambio fue una modificacin de licencia de /#8[L, que obligo a PHP a %acer de /#8[L una base de datos m1s, # no @L9@ base de datos, como venia siendo en PHP3 # PHP> /anual de PHP 5 0 /anual completo P1gina 3> de 34He todas formas, esto no repercute en nuestro cdigo, sino en la performance de nuestra aplicacin

'l %ec%o de que una e5tensin no forme parte del Core de PHP # pase a ser e5terna nos genera un over%ead, una sobrecarga de ejecucin en detrimento de la performance Como contrapartida, PHP5 nos da la posibilidad de sacarle el ma#or jugo posible a las muc%as mejoras incorporadas en /#8[L > E 3 o superior, a trav"s del 9P7 m#sqli 'sto implica %acer uso de otras funciones, modificando nuestro cdigo 9%ora bien, ^que tan costosa es esta reescritura\ Hepender1 de nuestra estrategia de cone5in a base de datos ^!tili6amos una capa de abstraccin del estilo 9HOdb T%ttp(--adodb sourceforge net-U\ 8i la utili6amos estaremos muc%o mejor parados frente a tal reescritura 'n caso contrario el tiempo invertido ser1 sensiblemente ma#or ^!tili6o un %osting e5terno\ 'n caso de no disponer de un %osting propio, # tener que depender de un %osting e5terno que nos provea de PHP, seguramente el %ec%o de pensar en migrar a PHP5 puede ser un problema He %ec%o, estad&sticas de principio de FNN4 nos indican que solo alrededor del 5Q de los %osting que proporcionan PHP, tienen PHP5 'sto no %ace mas que reflejar la lentitud con la que se esta moviendo el proceso de traspaso de PHP> %acia PHP5 !na pregunta que surge directamente sobre este tema es ^Por qu"\ _ueno, si uno tomo una distribucin de Linu5, es poco probable que la versin de PHP5 sea la incluida La conformidad de los programadores con PHP> es grande, # muc%a de la documentacin e5istente esta escrita para PHP> He todas formas, a no dormirse con PHP> !n tema que se trata en la segunda parte de este art&culo es lo nuevo que nos trae PHP4 Aeremos que PHP5 en muc%os aspectos es una transicin mientras que la confirmacin se llama PHP4 ^/i aplicacin sufre modificaciones en cuanto a los requerimientos # lgica de negocios\ Cuando las aplicaciones tienen requerimientos de cliente bastante cambiantes, # se emplean recursos para su mantenimiento, o utili6amos una metodolog&a de desarrollo incremental (soft<are versionado), lo ideal es utili6ar lo Dltimo que nos proporciona nuestra plataforma de programacin Seneralmente lo que se busca es un cambio gradual, modular, # sostenido Por otro lado, si nuestras aplicaciones residen en produccin sin ma#ores modificaciones (algDn proceso batc%, alguna aplicacin depurada, algDn algoritmo estable) # estamos conformes con su funcionamiento, qui61s no sea de nuestro inter"s migrar %acia una nueva versin Jos queda anali6ar que %a# de nuevo en PHP4 # que cosas deber&amos ir teniendo en cuenta si utili6amos PHP> o PHP5 9utores del manual( Ha# que agradecer a diversas personas la dedicacin prestada para la creacin de este manual 8us nombres junto con el nDmero de art&culos redactados por cada uno son los siguientes( 6 /iguel 9ngel 9lvare6 Hirector de Hesarrollo`eb com (E4 cap&tulos) 6 Haniel Lpe6 %ttp(--pic%ongol blogspot com(E cap&tulo) /anual de PHP 5 0 /anual completo P1gina 35 de 34)odos los derec%os de reproduccin # difusin T%ttp(--<<< desarrollo<eb com-cop#rig%t-U reservados a Suiarte /ultimedia 8 L T%ttp(--<<< guiartemultimedia com-U Aolver T%ttp(--<<< desarrollo<eb

S-ar putea să vă placă și