ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas...

60
ORIENTACIÓN A ORIENTACIÓN A OBJETOS EN PHP5 OBJETOS EN PHP5 Natalia Díaz Rodríguez Natalia Díaz Rodríguez Victoria López Morales Victoria López Morales 3º A Ingeniería Informática 3º A Ingeniería Informática Curso 2006 Curso 2006 - - 2007 2007 PROGRAMACIÓN DIRIGIDA A OBJETOS PROGRAMACIÓN DIRIGIDA A OBJETOS

Transcript of ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas...

Page 1: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

ORIENTACIÓN A ORIENTACIÓN A OBJETOS EN PHP5OBJETOS EN PHP5

Natalia Díaz RodríguezNatalia Díaz RodríguezVictoria López MoralesVictoria López Morales

3º A Ingeniería Informática3º A Ingeniería InformáticaCurso 2006Curso 2006--20072007

PROGRAMACIÓN DIRIGIDA A OBJETOSPROGRAMACIÓN DIRIGIDA A OBJETOS

Page 2: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HistoriaHistoria e e Introducción a PHP 5Introducción a PHP 5►► PHPPHP es un es un lenguaje de programaciónlenguaje de programación interpretado usado generalmente interpretado usado generalmente

para la creación de contenido dinámico para sitios para la creación de contenido dinámico para sitios webweb y aplicaciones para y aplicaciones para servidores. PHP es un servidores. PHP es un acrónimo acrónimo que significa "que significa "PHP PHP HypertextHypertext PrePre--processorprocessor" (inicialmente " (inicialmente PHP PHP ToolsTools, o, , o, PPersonal ersonal HHomeome PPageage ToolsTools).).

►► Con las primeras 2 versiones de PHP, PHP 3 y PHP 4, se había conCon las primeras 2 versiones de PHP, PHP 3 y PHP 4, se había conseguido seguido una plataforma potente y estable, haciendo posible que PHP sea euna plataforma potente y estable, haciendo posible que PHP sea el l lenguaje más utilizado en la lenguaje más utilizado en la webweb para la realización de páginaspara la realización de páginasavanzadas.avanzadas.

►► Sin embargo, todavía existían puntos negros en el desarrollo PHPSin embargo, todavía existían puntos negros en el desarrollo PHP que se que se han tratado de solucionar con la versión 5, aspectos que se echahan tratado de solucionar con la versión 5, aspectos que se echaron en ron en falta en la versión 4, casi desde el día de su lanzamiento. Nos falta en la versión 4, casi desde el día de su lanzamiento. Nos referimos referimos principalmente a la programación orientada a objetosprincipalmente a la programación orientada a objetos (POO) (POO) que, a pesar que, a pesar de quede que estaba soportada a partir de PHP3, sólo implementaba una estaba soportada a partir de PHP3, sólo implementaba una parte muy pequeña de las características de este tipo de parte muy pequeña de las características de este tipo de programación. programación.

►► El El principal objetivo de PHP5principal objetivo de PHP5 ha sido ha sido mejorar los mecanismos de mejorar los mecanismos de POOPOO para solucionar las carencias de las anteriores versiones. Un ppara solucionar las carencias de las anteriores versiones. Un paso aso necesario para conseguir que PHP sea un necesario para conseguir que PHP sea un lenguaje apto para todo tipo lenguaje apto para todo tipo de aplicaciones y entornos,de aplicaciones y entornos, incluso los más exigentes.incluso los más exigentes.

Page 3: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Modelo de orientación a objetos Modelo de orientación a objetos en PHP 5en PHP 5

Uno de los problemas básicos de las versiones anteriores de PHP Uno de los problemas básicos de las versiones anteriores de PHP era era la clonación de objetos, que se realizaba al asignar un objeto ala clonación de objetos, que se realizaba al asignar un objeto a otra otra variable o al pasar un objeto por parámetro en una función. Paravariable o al pasar un objeto por parámetro en una función. Parasolventar este problema PHP5 hace uso de los manejadores de objesolventar este problema PHP5 hace uso de los manejadores de objetos tos ((ObjectObject handleshandles), una especie de punteros que apuntan hacia los espacios ), una especie de punteros que apuntan hacia los espacios en memoria donde residen los objetos. Cuando se asigna un manejaen memoria donde residen los objetos. Cuando se asigna un manejador dor de objetos o se pasa como parámetro en una función, se duplica ede objetos o se pasa como parámetro en una función, se duplica el propio l propio objectobject handlehandle y no el objeto en si. y no el objeto en si.

Algunas características del trabajo con POO en PHP 5Algunas características del trabajo con POO en PHP 5

1.1.-- Nombres fijos para los constructores y destructoresNombres fijos para los constructores y destructoresLos nombres predefinidos para los métodos constructores y Los nombres predefinidos para los métodos constructores y destructores son __destructores son __constructconstruct() y __() y __destructdestruct(). ().

Page 4: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

2.2.-- Acceso Acceso publicpublic, , privateprivate y y protectedprotected a propiedades y métodos a propiedades y métodos Estos modificadores de acceso habituales de la POO sirven para dEstos modificadores de acceso habituales de la POO sirven para definir efinir qué métodos y propiedades de las clases son accesibles desde cadqué métodos y propiedades de las clases son accesibles desde cada a entorno. entorno.

3.3.-- Posibilidad de uso de interfacesPosibilidad de uso de interfacesÉstas se utilizan en la POO para definir un conjunto de métodos Éstas se utilizan en la POO para definir un conjunto de métodos que que implementa una clase. Una clase puede implementar varias interfaimplementa una clase. Una clase puede implementar varias interfaces o ces o conjuntos de métodos. conjuntos de métodos.

4.4.-- Métodos y clases finalMétodos y clases finalSe puede indicar que un método es "final” o que la clase es "finSe puede indicar que un método es "final” o que la clase es "final", lo al", lo que se indica es que esa clase no permite ser heredada por otra que se indica es que esa clase no permite ser heredada por otra clase. clase.

5.5.-- Operador Operador instanceofinstanceofSe utiliza para saber si un objeto es una instancia de una claseSe utiliza para saber si un objeto es una instancia de una clasedeterminada. determinada.

6.6.-- Atributos y métodos Atributos y métodos staticstaticSon las propiedades y funcionalidades a las que se puede accederSon las propiedades y funcionalidades a las que se puede acceder a a partir del nombre de clase, sin necesidad de haber partir del nombre de clase, sin necesidad de haber instanciadoinstanciado un un objeto de dicha clase.objeto de dicha clase.

Page 5: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

7.7.-- Clases y métodos abstractosClases y métodos abstractosLas clases abstractas no se pueden Las clases abstractas no se pueden instanciarinstanciar y los métodos y los métodos abstractos no se pueden llamar. Ambos se utilizan más bien abstractos no se pueden llamar. Ambos se utilizan más bien para ser heredados por otras clases, donde no tienen porque para ser heredados por otras clases, donde no tienen porque ser declarados abstractos.ser declarados abstractos.

8.8.-- Constantes de claseConstantes de claseSe pueden definir constantes dentro de la clase y luego acceder Se pueden definir constantes dentro de la clase y luego acceder a ellas a través de la propia clase. a ellas a través de la propia clase.

9.9.-- Funciones que especifican la clase que reciben por Funciones que especifican la clase que reciben por parámetroparámetroEn caso que el objeto no sea de la clase correcta, se produce unEn caso que el objeto no sea de la clase correcta, se produce unerror.error.

10.10.-- Función __Función __autoloadautoload()()La función __La función __autoloadautoload() sirve para incluir el código de una clase () sirve para incluir el código de una clase que se necesite, y que no haya sido declarada todavía en el que se necesite, y que no haya sido declarada todavía en el código que se está ejecutando. código que se está ejecutando.

Page 6: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Ejemplo de Clase y de ObjetoEjemplo de Clase y de Objetoclassclass hombre{ hombre{

varvar $nombre; $nombre;

varvar $edad; $edad;

functionfunction comer($comida){ comer($comida){

//aquí el código del método //aquí el código del método

} }

functionfunction moverse($destino){ moverse($destino){

//aquí el código del método //aquí el código del método

} }

functionfunction estudiar($asignatura){ estudiar($asignatura){

//aquí el código del método //aquí el código del método

} }

} }

______________________________________________________________________________

$pepe$pepe = = newnew hombre(); hombre();

$juan$juan = = newnew hombre();hombre();

Page 7: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

►► Deben llamarse con un nombre fijo: Deben llamarse con un nombre fijo: ____constructconstruct().().

►► La creación del destructor es opcional. Sólo debemos crearlo si La creación del destructor es opcional. Sólo debemos crearlo si deseamos hacer alguna tarea específica cuando un objeto se deseamos hacer alguna tarea específica cuando un objeto se elimine de la memoria. elimine de la memoria.

►► El destructor debe declararse con un nombre fijo: El destructor debe declararse con un nombre fijo: ____destructdestruct().().►► El destructor se ejecuta justo antes de que el objeto sea eliminEl destructor se ejecuta justo antes de que el objeto sea eliminado ado

de memoria. En PHP5 de memoria. En PHP5 un objeto desaparece cuando ya no es un objeto desaparece cuando ya no es referenciadoreferenciado, es decir, cuando todos sus manejadores han , es decir, cuando todos sus manejadores han desaparecido. desaparecido.

►► El hecho de que El hecho de que todos los constructorestodos los constructores tengan el tengan el mismo mismo nombre facilita la llamadanombre facilita la llamada al constructor de la clase base al constructor de la clase base desde su clase derivada.desde su clase derivada.

ConstructoresConstructores

DestructoresDestructores

Page 8: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

►► En el siguiente ejemplo sobre un videoclub vemos su funcionamieEn el siguiente ejemplo sobre un videoclub vemos su funcionamiento:nto:

classclass cliente{ cliente{ varvar $nombre$nombre; ; varvar $numero$numero; ; varvar $peliculas_alquiladas$peliculas_alquiladas; ;

functionfunction ________________constructconstructconstructconstructconstructconstructconstructconstruct(($nombre$nombre,,$numero$numero){ ){ $this$this$this$this$this$this$this$this-->nombre=>nombre=$nombre$nombre; ; $this$this-->numero=>numero=$numero$numero; ; $this$this-->>peliculas_alquiladaspeliculas_alquiladas==arrayarray(); ();

} }

functionfunction ________________destructdestructdestructdestructdestructdestructdestructdestruct(){ (){ echo "<echo "<brbr>destruido: " . >destruido: " . $this$this-->nombre; >nombre;

} }

functionfunction dame_numerodame_numero(){ (){ returnreturn $this$this-->numero; >numero;

} } } }

EJEMPLO:

Page 9: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

USO:USO:////instanciamosinstanciamosinstanciamosinstanciamosinstanciamosinstanciamosinstanciamosinstanciamos un par de objetos cliente un par de objetos cliente $cliente1$cliente1 = = newnew cliente("Pepe", 1); cliente("Pepe", 1); $cliente2$cliente2 = = newnew cliente("Roberto", 564); cliente("Roberto", 564);

//mostramos el numero de cada cliente creado //mostramos el numero de cada cliente creado echo "El identificador del cliente 1 es: " . echo "El identificador del cliente 1 es: " . $cliente1$cliente1-->>dame_numerodame_numero(); (); echo "El identificador del cliente 2 es: " . echo "El identificador del cliente 2 es: " . $cliente2$cliente2-->>dame_numerodame_numero();();

►► El destructor imprime un mensaje en pantalla con el nombre del cEl destructor imprime un mensaje en pantalla con el nombre del cliente que se liente que se ha destruido. Tras su ejecución obtendríamos la siguiente salidaha destruido. Tras su ejecución obtendríamos la siguiente salida. .

El identificador del cliente 1 es: 1 El identificador del cliente 1 es: 1 El identificador del cliente 2 es: 564 El identificador del cliente 2 es: 564 destruido: Pepe destruido: Pepe destruido: Robertodestruido: Roberto

Como vemos, antes de acabar el Como vemos, antes de acabar el scriptscript, se libera el espacio en memoria de los , se libera el espacio en memoria de los objetos construidosobjetos construidos

Page 10: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

►► Si una Si una variable localvariable local deja de existir, se llama deja de existir, se llama al destructor definido para ese objeto. al destructor definido para ese objeto.

►► También podemos deshacernos de un objeto También podemos deshacernos de un objeto sin necesidad que acabe el ámbito donde fue sin necesidad que acabe el ámbito donde fue creado. Para ello tenemos la función creado. Para ello tenemos la función unsetunset()()que que recibe una variable y la elimina de la recibe una variable y la elimina de la memoriamemoria. Cuando se pierde una variable que . Cuando se pierde una variable que contiene un objeto y ese objeto deja de tener contiene un objeto y ese objeto deja de tener referencias, se elimina al objeto y se llama al referencias, se elimina al objeto y se llama al destructor. destructor.

Page 11: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Modificadores de acceso a métodos Modificadores de acceso a métodos y propiedades en PHP5y propiedades en PHP5

►► PublicPublic:: puede acceder a ese atributo, cualquier puede acceder a ese atributo, cualquier otro elemento de nuestro programa. Es el otro elemento de nuestro programa. Es el modificador por defecto.modificador por defecto.

►► PrivatePrivate : Indica que esa variable sólo se va a : Indica que esa variable sólo se va a poder acceder desde el propio objeto, nunca poder acceder desde el propio objeto, nunca desde fuera. (Nivel de acceso más restrictivo). desde fuera. (Nivel de acceso más restrictivo).

►► ProtectedProtected: : El método/ atributo es público dentro El método/ atributo es público dentro de la propia clase y en sus heredadas. Es privado de la propia clase y en sus heredadas. Es privado desde cualquier otra parte. (Indica un nivel de desde cualquier otra parte. (Indica un nivel de acceso medio). acceso medio).

Page 12: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Referencias, manejadores, Referencias, manejadores, handlershandlers

►► Los objetos en PHP5 son referenciados a través de Los objetos en PHP5 son referenciados a través de manejadores manejadores ((handlershandlers, referencias). , referencias).

►► Como consecuencia de esta característica, cuando se hace una Como consecuencia de esta característica, cuando se hace una asignación de un objetoasignación de un objeto en realidad sólo en realidad sólo se duplica el se duplica el manejadormanejador (referencia) (referencia) y no el objeto completo.y no el objeto completo.

►► Lo mismo ocurre con los objetos pasados como Lo mismo ocurre con los objetos pasados como parámetros a las parámetros a las funciones: siemprefunciones: siempre se pasan se pasan por referenciapor referencia puesto que con lo puesto que con lo que se trabaja dentro de la función es un que se trabaja dentro de la función es un duplicado del duplicado del manejadormanejador original del objeto. original del objeto.

►► Ejemplo:Ejemplo:Con la sentencia Con la sentencia

$obj_alias$obj_alias = = $obj_vehiculo$obj_vehiculo

estamos creando un estamos creando un alias del objeto (duplicamos el alias del objeto (duplicamos el manejadormanejador). Cualquier operación sobre ). Cualquier operación sobre $obj_alias$obj_alias afecta a las afecta a las características de características de $obj_vehiculo$obj_vehiculo. .

Page 13: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

El Constructor de copia __clone() El Constructor de copia __clone() y el operador y el operador $this$this//$that$that

►► Las Las variablesvariables que representan objetos que representan objetos sonson en realidad en realidad referenciasreferencias (manejadores, (manejadores, handlershandlers) ) al objetoal objeto en sí. en sí.

►► Sin embargo, en ocasiones es útil la posibilidad de copiar Sin embargo, en ocasiones es útil la posibilidad de copiar objetos. PHP5 introduce el método predefinido objetos. PHP5 introduce el método predefinido __clone()__clone(), , disponible por defecto en todos los disponible por defecto en todos los objetos y objetos y redefinibleredefinible para cada clase. para cada clase.

►► Si no se redefineSi no se redefine el método clone en una clase, la el método clone en una clase, la copiacopia del objeto se realiza del objeto se realiza bitbit a a bitbit. Es decir, el objeto . Es decir, el objeto resultante es una copia exacta del original resultante es una copia exacta del original

►► Ejemplo: copia de objetos Ejemplo: copia de objetos $vehiculo2$vehiculo2 = vehiculo1= vehiculo1-->__clone(); >__clone();

►► Hay casos en los que interesará crear métodos __clone() Hay casos en los que interesará crear métodos __clone() a medida.a medida.

Page 14: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

El Constructor de copia __clone() El Constructor de copia __clone() y el operador y el operador $this$this//$that$that

►► classclass Rueda { Rueda { publicpublic $nombre$nombre; ;

functionfunction ____constructconstruct(($nombre$nombre) { ) { $this$this-->nombre = >nombre = $nombre$nombre; ;

} } }}

class class MotoMoto { { public $public $marcamarca; ; publicpublic $ruedas$ruedas = = arrayarray(); ();

//// constructor de copia para Moto//// constructor de copia para Moto//////////////////////////////// $that$that$that$that$that$that$that$that referencia al objeto original referencia al objeto original referencia al objeto original referencia al objeto original referencia al objeto original referencia al objeto original referencia al objeto original referencia al objeto original //// //// //// //// //// //// //// //// $this$this$this$this$this$this$this$this referencia al objeto clonado referencia al objeto clonado referencia al objeto clonado referencia al objeto clonado referencia al objeto clonado referencia al objeto clonado referencia al objeto clonado referencia al objeto clonado functionfunction __clone() { __clone() {

$this$this-->ruedas['del'] = >ruedas['del'] = newnew Rueda Rueda (($that$that-->ruedas['del']>ruedas['del']-->nombre); >nombre); $this$this-->ruedas['tras'] = >ruedas['tras'] = newnew Rueda Rueda (($that$that-->ruedas['tras']>ruedas['tras']-->nombre); } >nombre); }

}}

Page 15: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

►► // creamos dos ruedas y una moto// creamos dos ruedas y una moto$rueda_delantera_mich$rueda_delantera_mich = = newnew Rueda ("delanteraRueda ("delantera--michelinmichelin"); "); $rueda_trasera_mich$rueda_trasera_mich = = newnew Rueda ("traseraRueda ("trasera--michelinmichelin"); "); $yamaha_R1$yamaha_R1 = = newnew Moto(); Moto(); $yamaha_R1$yamaha_R1-->marca = ">marca = "YamahaYamaha R1"; R1"; $yamaha_R1$yamaha_R1-->ruedas['del'] = >ruedas['del'] = $rueda_delantera_mich$rueda_delantera_mich; ; $yamaha_R1$yamaha_R1-->ruedas['tras'] = >ruedas['tras'] = $rueda_trasera_mich$rueda_trasera_mich; ;

// clonamos la moto // clonamos la moto $yamaha_R1$yamaha_R1$yamaha_R1$yamaha_R1$yamaha_R1$yamaha_R1$yamaha_R1$yamaha_R1_bis = _bis = _bis = _bis = _bis = _bis = _bis = _bis = $yamaha_R1$yamaha_R1$yamaha_R1$yamaha_R1$yamaha_R1$yamaha_R1$yamaha_R1$yamaha_R1-------->__clone();>__clone();>__clone();>__clone();>__clone();>__clone();>__clone();>__clone();

El Constructor de copia __clone() El Constructor de copia __clone() y el operador y el operador $this$this//$that$that

Page 16: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

El Constructor de copia __clone() El Constructor de copia __clone() y el operador y el operador $this$this//$that$that

►► El método __clone() de Moto crea nuevas ruedas en la El método __clone() de Moto crea nuevas ruedas en la moto clonada. Como en el constructor de copia intervienen moto clonada. Como en el constructor de copia intervienen dos objetos, la palabra clave dos objetos, la palabra clave $that$that, , hace referencia al hace referencia al objeto original,objeto original, mientras que mientras que $this$this hace referencia al hace referencia al nuevo objeto (nuevo objeto (objetoobjeto clonado).clonado).

►► Hay que tener en cuenta que Hay que tener en cuenta que la copia la copia bitbit a a bitbit se sigue se sigue realizando de forma automática,realizando de forma automática, replicando todos los replicando todos los atributos del objeto Moto original en el objeto Moto atributos del objeto Moto original en el objeto Moto duplicado. La funcionalidad del duplicado. La funcionalidad del método __clone() método __clone() incluido en una clase se ejecuta después de esta incluido en una clase se ejecuta después de esta copia copia bitbit a a bitbit. En el ejemplo anterior, el atributo . En el ejemplo anterior, el atributo $marca$marca se duplica de forma automática (el método se duplica de forma automática (el método __clone() no hace nada al respecto)__clone() no hace nada al respecto)

Page 17: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Comparación de objetosComparación de objetos

►► Cuando se usa el Cuando se usa el operador de comparaciónoperador de comparación ((====), las ), las variables del objeto son comparadas de una forma variables del objeto son comparadas de una forma simple, es decir, simple, es decir, dos instancias de objetosdos instancias de objetos son son igualesiguales si tienes los si tienes los mismos atributos y valoresmismos atributos y valores, y , y son son instancias de la misma claseinstancias de la misma clase. .

►► Por otro lado, cuando se usa el Por otro lado, cuando se usa el operador idénticooperador idéntico((======), las variables del objeto son idénticas sólo ), las variables del objeto son idénticas sólo si si refieren a la misma instancia de la misma claserefieren a la misma instancia de la misma clase. .

Page 18: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Control de tipos en PHPControl de tipos en PHP►► El control de tipos en parámetros pasados a funciones y métodos El control de tipos en parámetros pasados a funciones y métodos sólo sólo

es válido para objetos, no para tipos elementales.es válido para objetos, no para tipos elementales.

classclass Persona { Persona { publicpublic $nombre$nombre; } ; }

classclass Gato { Gato { publicpublic $nombre$nombre; }; }

// esta // esta funcionfuncion solo puede recibir objetos de tipo Persona solo puede recibir objetos de tipo Persona

functionfunction muestraNombre(PersonamuestraNombre(Persona $persona$persona) { ) {

echo echo $persona$persona-->nombre; >nombre;

} }

$persona$persona = = newnew Persona; Persona;

$persona$persona-->nombre = "Pepe"; >nombre = "Pepe";

$gato$gato = = newnew Gato; Gato;

$gato$gato-->nombre = ">nombre = "RufusRufus"; ";

muestraNombremuestraNombremuestraNombremuestraNombremuestraNombremuestraNombremuestraNombremuestraNombre (((((((($persona$persona$persona$persona$persona$persona$persona$persona); // correcto ); // correcto ); // correcto ); // correcto ); // correcto ); // correcto ); // correcto ); // correcto

muestraNombremuestraNombremuestraNombremuestraNombremuestraNombremuestraNombremuestraNombremuestraNombre (((((((($gato$gato$gato$gato$gato$gato$gato$gato); // ERROR: un gato no es una persona); // ERROR: un gato no es una persona); // ERROR: un gato no es una persona); // ERROR: un gato no es una persona); // ERROR: un gato no es una persona); // ERROR: un gato no es una persona); // ERROR: un gato no es una persona); // ERROR: un gato no es una persona

►► Parece lógico que si una función acepta objetos de una determinaParece lógico que si una función acepta objetos de una determinada da clase, los acepte también de sus clases derivadas.clase, los acepte también de sus clases derivadas.

Page 19: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA en PHP5HERENCIA en PHP5►► Ejemplo:Ejemplo: VideoclubVideoclub

Los Los videoclubsvideoclubs ofrecen distintos ofrecen distintos tipos de elementostipos de elementospara para alquileralquiler, como pueden ser las , como pueden ser las películaspelículas ((cintas cintas de vídeo o DVDde vídeo o DVD) y los ) y los juegosjuegos. Cada elemento tiene . Cada elemento tiene unas unas características propiascaracterísticas propias y algunas y algunas comunescomunes. A la . A la clase general que indica cualquier tipo de elemento a clase general que indica cualquier tipo de elemento a alquilar la llamamos alquilar la llamamos “soporte”“soporte”, que incluye las , que incluye las características comunescaracterísticas comunes para todos los tipos de para todos los tipos de elementos en alquiler que tenemos en el videoclub. elementos en alquiler que tenemos en el videoclub. Luego hemos creado Luego hemos creado tres tipos de soportes distintostres tipos de soportes distintos, , que heredan de la clase soporte, que incluyen algunas que heredan de la clase soporte, que incluyen algunas características y funcionalidades nuevas, pero que características y funcionalidades nuevas, pero que también se encuentran enmarcados dentro de las también se encuentran enmarcados dentro de las características comunes del soporte. Estos tipos de características comunes del soporte. Estos tipos de soporte serán soporte serán "cinta_video""cinta_video", , "dvd""dvd" y y "juego""juego". .

Page 20: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA en PHP5HERENCIA en PHP5

Page 21: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► classclass soporte{ soporte{ publicpublic $titulo; $titulo; protectedprotected $numero; $numero; private $precio; private $precio;

functionfunction ____constructconstruct(($tit$tit,,$num$num,$precio){ ,$precio){ $this$this-->titulo = >titulo = $tit$tit; ; $this$this-->numero = >numero = $num$num; ; $this$this-->precio = $precio; >precio = $precio;

} }

publicpublic functionfunction dame_precio_sin_ivadame_precio_sin_iva(){ (){ returnreturn $this$this-->precio; >precio;

}}

Clase soporteClase soporte

Page 22: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

publicpublic functionfunction dame_precio_con_ivadame_precio_con_iva(){ (){ returnreturn $this$this-->precio * 1.16; >precio * 1.16;

} }

publicpublic functionfunction dame_numero_identificaciondame_numero_identificacion(){ (){ returnreturn $this$this-->numero; >numero;

} }

publicpublic functionfunction imprime_caracteristicasimprime_caracteristicas(){ (){ echo echo $this$this-->titulo; >titulo; echo "<echo "<brbr>" . >" . $this$this-->precio . " (IVA no >precio . " (IVA no

incluido)"; incluido)"; } }

}}

Clase soporteClase soporte

Page 23: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► Los atributos hay en esta clase son Los atributos hay en esta clase son títulotítulo, , numeronumero (un (un identificador del soporte) y identificador del soporte) y precioprecio. Si prestamos atención, cada . Si prestamos atención, cada uno de ellos se ha definido con un modificador de acceso uno de ellos se ha definido con un modificador de acceso distinto (distinto (publicpublic, , protectedprotected, private), para ver cómo se maneja el , private), para ver cómo se maneja el acceso en las subclases en cada uno de estos casos.acceso en las subclases en cada uno de estos casos.

►► Como se ha definido como Como se ha definido como privateprivate el atributo el atributo precioprecio, este , este atributo atributo sólo se podrá acceder dentro del código de la clasesólo se podrá acceder dentro del código de la clase, es , es decir, en la propia decir, en la propia definición del objetodefinición del objeto. Si queremos acceder al . Si queremos acceder al precio precio desde fueradesde fuera de la clase (algo muy normal si tenemos en de la clase (algo muy normal si tenemos en cuenta que vamos a necesitar el precio de un soporte desde cuenta que vamos a necesitar el precio de un soporte desde otras partes de la aplicación) será necesario otras partes de la aplicación) será necesario crear un métodocrear un métodoque nos que nos devuelva el valor del preciodevuelva el valor del precio. Este . Este métodométodo debería debería definirse como definirse como publicpublic, para que se pueda acceder desde , para que se pueda acceder desde

cualquier sitio que se necesite.cualquier sitio que se necesite.

Clase soporteClase soporte

Page 24: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► Hemos definido un Hemos definido un constructorconstructor, que recibe los valores , que recibe los valores para la para la inicialización del objetoinicialización del objeto. Un método . Un método dame_precio_sin_ivadame_precio_sin_iva()(), que devuelve el precio del , que devuelve el precio del soporte, sin aplicarle el IVA. Otro método soporte, sin aplicarle el IVA. Otro método dame_precio_con_ivadame_precio_con_iva()(), que devuelve el precio una , que devuelve el precio una vez aplicado el 16% de IVA. El método vez aplicado el 16% de IVA. El método dame_numero_identificaciondame_numero_identificacion()(), que devuelve el , que devuelve el número de identificador y número de identificador y imprime_caracteristicasimprime_caracteristicas()(), , que muestra en la página las características de este que muestra en la página las características de este soporte.soporte.

►► En todos los métodos se hace uso de la En todos los métodos se hace uso de la variable variable $this$this. . Esta variable no es más que una Esta variable no es más que una referencia al objetoreferencia al objetosobre el que se está ejecutando el método.sobre el que se está ejecutando el método.

Clase soporteClase soporte

Page 25: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► Para Para ejecutarejecutar cualquiera de estos cualquiera de estos métodosmétodos, , primeroprimerotenemos que tenemos que haber creado un objeto a partir de una haber creado un objeto a partir de una claseclase. Luego podremos llamar los métodos de un objeto. . Luego podremos llamar los métodos de un objeto.

►► Esto se hace con Esto se hace con $mi_objeto$mi_objeto-->>metodo_a_llamarmetodo_a_llamar()(). .

►► Dentro de método, cuando se utiliza la variable Dentro de método, cuando se utiliza la variable $this$this, se , se está haciendo referencia al objeto sobre el que se ha está haciendo referencia al objeto sobre el que se ha llamado al método, en este caso, el objeto $mi_objeto. llamado al método, en este caso, el objeto $mi_objeto. Con Con $this$this-->titulo estamos haciendo referencia al atributo >titulo estamos haciendo referencia al atributo "titulo" que tiene el objeto $mi_objeto. "titulo" que tiene el objeto $mi_objeto.

Clase soporteClase soporte

Page 26: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► Ejemplo de uso de la clase:Ejemplo de uso de la clase:

$soporte1$soporte1 = = newnew soporte("Los Intocables",22,3); soporte("Los Intocables",22,3);

echo "<b>" . echo "<b>" . $soporte1$soporte1-->titulo . "</b>"; >titulo . "</b>";

echo "<echo "<brbr>Precio: " . >Precio: " . $soporte1$soporte1-->>dame_precio_sin_ivadame_precio_sin_iva() . " euros"; () . " euros";

echo "<echo "<brbr>Precio IVA incluido: " . >Precio IVA incluido: " . $soporte1$soporte1-->>dame_precio_con_ivadame_precio_con_iva() . " euros";() . " euros";

Clase soporteClase soporte

Page 27: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► En este caso hemos creado una instancia de la clase soporte, En este caso hemos creado una instancia de la clase soporte, en un objeto que hemos llamado en un objeto que hemos llamado $soporte1$soporte1. Luego . Luego imprimimos su atributo título (como el título ha sido definido imprimimos su atributo título (como el título ha sido definido como como publicpublic, podemos acceder a él desde fuera del código , podemos acceder a él desde fuera del código de la clase). de la clase). Finalmente se llaman a los métodos Finalmente se llaman a los métodos dame_precio_sin_ivadame_precio_sin_iva() y () y dame_precio_con_ivadame_precio_con_iva() para el objeto creado, y el resultado () para el objeto creado, y el resultado lo mostramos por pantalla. lo mostramos por pantalla.

Nos daría como resultado esto:Nos daría como resultado esto:

Los Intocables Los Intocables Precio: 3 euros Precio: 3 euros

Precio IVA incluido: 3.48 eurosPrecio IVA incluido: 3.48 euros

Clase soporteClase soporte

Page 28: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► Siguiendo con el diagrama de clases propuesta para Siguiendo con el diagrama de clases propuesta para el videoclub, construimos una clase para los soportes el videoclub, construimos una clase para los soportes de tipo cinta de vídeo. Las de tipo cinta de vídeo. Las cintas de vídeocintas de vídeo tienen tienen un atributo nuevoun atributo nuevo que es la que es la duración de la duración de la cintacinta. . NoNo tienen ningún tienen ningún método nuevométodo nuevo, pero sí , pero sí que hay que que hay que redefinir los métodosredefinir los métodos de la clase de la clase soporte, en concreto, hay que redefinir el constructor soporte, en concreto, hay que redefinir el constructor (ya que ahora necesitamos una variable más que (ya que ahora necesitamos una variable más que indique la duración) y la función que imprime indique la duración) y la función que imprime características ya que la duración también hay que características ya que la duración también hay que imprimirla ahora.imprimirla ahora.

Clase Clase cinta_videocinta_video

Page 29: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

classclass cinta_videocinta_video extendsextendsextendsextendsextendsextendsextendsextends soportesoportesoportesoportesoportesoportesoportesoporte { { protectedprotected $duracion$duracion; ;

functionfunction ____constructconstruct(($tit$tit,,$num$num,,$precio$precio,,$duracion$duracion){ ){ parentparentparentparentparentparentparentparent::::::::::::::::____constructconstruct(($tit$tit,,$num$num,,$precio$precio); ); $this$this-->>duracionduracion = = $duracion$duracion; ;

} }

publicpublic functionfunction imprime_caracteristicasimprime_caracteristicas(){ (){ echo "Película en VHS:<echo "Película en VHS:<brbr>"; >"; parentparentparentparentparentparentparentparent::::::::::::::::imprime_caracteristicasimprime_caracteristicas(); (); echo "<echo "<brbr>Duración: " . >Duración: " . $this$this-->>duracionduracion; ;

} } }}

Clase Clase cinta_videocinta_video

Page 30: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► Con la primera línea Con la primera línea classclass cinta_videocinta_video extendsextends

soportesoporte estamos indicando que se está estamos indicando que se está definiendodefiniendola la clase clase cinta_videocinta_video y que va a y que va a heredarheredar de la de la clase clase soportesoporte. .

►► Como Como se está heredando de una clasese está heredando de una clase, PHP tiene que , PHP tiene que conocer el código de la clase "padre"conocer el código de la clase "padre", en este caso la , en este caso la clase soporte. Podemos colocar los dos códigos en el clase soporte. Podemos colocar los dos códigos en el mismo fichero, o si están en ficheros independientes, mismo fichero, o si están en ficheros independientes, debemos incluir el código de la clase soporte con la debemos incluir el código de la clase soporte con la instrucción instrucción includeinclude o o requirerequire de PHP. de PHP.

►► En la clase En la clase cinta_videocinta_video hemos definido un hemos definido un nuevo nuevo atributoatributo llamado llamado $duracion$duracion, que almacena el tiempo , que almacena el tiempo que dura la película. que dura la película.

Clase Clase cinta_videocinta_video

Page 31: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

CONSTRUCTORCONSTRUCTOR

►► Aunque la clase sobre la que heredamos (la clase Aunque la clase sobre la que heredamos (la clase soporte) tenía definido un constructor, la cinta de soporte) tenía definido un constructor, la cinta de vídeo debe inicializar la nueva propiedad vídeo debe inicializar la nueva propiedad $duracion$duracion, , que es específica de las cintas de video. que es específica de las cintas de video.

►► Por ello, vamos a Por ello, vamos a redefinirredefinir el método el método constructorconstructor, , lo que se hace simplemente lo que se hace simplemente volviendo a escribir el volviendo a escribir el métodométodo. Ahora, para la . Ahora, para la clase clase cinta_videocinta_video, hay , hay que que inicializarinicializar loslos atributosatributos definidos en la definidos en la clase clase

soportesoporte, , másmás el el atributo atributo $duracion$duracion$duracion$duracion$duracion$duracion$duracion$duracion, que es , que es propio de propio de cinta_videocinta_video. .

Clase Clase cinta_videocinta_video

Page 32: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

CONSTRUCTORCONSTRUCTOR

►► En la En la primera líneaprimera línea del constructor del constructor se llama al se llama al constructorconstructor creado para la creado para la clase soporteclase soporte. Para . Para ello utilizamos ello utilizamos parentparent:::: y luego y luego el nombre del el nombre del método de la clase padre al que se quiere llamarmétodo de la clase padre al que se quiere llamar, en , en este caso __constructor(). Al este caso __constructor(). Al constructor de la clase constructor de la clase padrepadre le enviamos las le enviamos las variablesvariables que se deben que se deben inicializarinicializar con la con la clase padreclase padre. .

►► En la En la segunda líneasegunda línea del constructor del constructor se inicializa el se inicializa el atributo atributo duracionduracion, con lo que hayamos recibido por , con lo que hayamos recibido por parámetro. parámetro.

Clase Clase cinta_videocinta_video

Page 33: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

IMPRIME_CARACTERÍSTICASIMPRIME_CARACTERÍSTICAS

►► Nos pasa lo mismo con el método Nos pasa lo mismo con el método imprime_caracteristicasimprime_caracteristicas()(),, que ahora que ahora debe mostrar también el nuevo atributodebe mostrar también el nuevo atributo, , propio de la propio de la clase clase cinta_videocinta_video. Como se puede . Como se puede observar en el código de la función, observar en el código de la función, se hace uso se hace uso tambiéntambién de de parentparent::::imprime_caracteristicasimprime_caracteristicas()() para para utilizar el método definido en la clase padreutilizar el método definido en la clase padre..

Clase Clase cinta_videocinta_video

Page 34: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► Ejemplo de uso de la clase:Ejemplo de uso de la clase:

$micinta$micinta = = newnew cinta_videocinta_video("Los Otros", 22, 4.5, "115 ("Los Otros", 22, 4.5, "115

minutos"); minutos");

echo "<b>" . echo "<b>" . $micinta$micinta-->titulo . "</b>"; >titulo . "</b>";

echo "<echo "<brbr>Precio: " . >Precio: " . $micinta$micinta-->>dame_precio_sin_ivadame_precio_sin_iva() () . " euros"; . " euros";

echo "<echo "<brbr>Precio IVA incluido: " . >Precio IVA incluido: " . $micinta$micinta-->>dame_precio_con_ivadame_precio_con_iva() . " euros";() . " euros";

echo "<echo "<brbr>" . >" . $micinta$micinta-->>imprime_caracteristicasimprime_caracteristicas();();

Clase Clase cinta_videocinta_video

Page 35: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► Nos daría como resultado esto:Nos daría como resultado esto:

Los Otros Los Otros

Precio: 4.5 euros Precio: 4.5 euros

Precio IVA incluido: 5.22 euros Precio IVA incluido: 5.22 euros Película en VHS: Película en VHS:

Los Otros Los Otros

4.5 (IVA no incluido) 4.5 (IVA no incluido)

Duración: 115 minutosDuración: 115 minutos

Clase Clase cinta_videocinta_video

Page 36: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► Una vez definidas la clase soporte y la clase Una vez definidas la clase soporte y la clase cinta_videocinta_video, continuamos la implementación del , continuamos la implementación del diagrama de clases con la diagrama de clases con la clase clase dvddvd, que es , que es muy parecida a la implementación que se ha muy parecida a la implementación que se ha visto para la clase visto para la clase cinta_videocinta_video. Lo único que . Lo único que cambia es que ahora vamos a cambia es que ahora vamos a definir otros definir otros atributosatributos relacionados con los DVD, como son relacionados con los DVD, como son los los idiomas disponiblesidiomas disponibles en el DVD y el en el DVD y el formato de pantallaformato de pantalla que tiene la grabación. que tiene la grabación.

Clase Clase dvddvd

Page 37: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

classclass dvddvd extendsextendsextendsextendsextendsextendsextendsextends soportesoportesoportesoportesoportesoportesoportesoporte { {

protectedprotected $idiomas_disponibles$idiomas_disponibles; ; protectedprotected $formato_pantalla$formato_pantalla; ;

functionfunction ____constructconstruct(($tit$tit,,$num$num,,$precio$precio,,$idiomas$idiomas,,$pantalla$pantalla){ ){

parentparentparentparentparentparentparentparent::::::::::::::::____constructconstruct(($tit$tit,,$num$num,,$precio$precio); ); $this$this-->>idiomas_disponiblesidiomas_disponibles = = $idiomas$idiomas; ;

$this$this-->>formato_pantallaformato_pantalla = = $pantalla$pantalla; ; } }

publicpublic functionfunction imprime_caracteristicasimprime_caracteristicas(){ (){ echo "Película en DVD:<echo "Película en DVD:<brbr>"; >";

parentparentparentparentparentparentparentparent::::::::::::::::imprime_caracteristicasimprime_caracteristicas(); (); echoecho "<"<brbr>" . >" . $this$this-->>idiomas_disponiblesidiomas_disponibles; ;

} }

}}

Clase Clase dvddvd

Page 38: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► Por su parte, la Por su parte, la clase juegoclase juego, tendrá , tendrá 3 nuevos 3 nuevos atributosatributos. Estos son . Estos son consolaconsola, para especificar la , para especificar la consola para la que está creado este juego, consola para la que está creado este juego, min_num_jugadoresmin_num_jugadores, para especificar el número , para especificar el número de jugadores mínimo y de jugadores mínimo y max_num_jugadoresmax_num_jugadores, , para especificar el máximo número de jugadores para especificar el máximo número de jugadores que pueden participar en el juego. que pueden participar en el juego.

Clase juegoClase juego

Page 39: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

classclass juego juego extendsextendsextendsextendsextendsextendsextendsextends soportesoportesoportesoportesoportesoportesoportesoporte{ {

protectedprotected $consola$consola; // consola del juego ; // consola del juego ejej: DS Lite : DS Lite

protectedprotected $min_num_jugadores$min_num_jugadores; ;

protectedprotected $max_num_jugadores$max_num_jugadores; ;

functionfunction

____constructconstruct(($tit$tit,,$num$num,,$precio$precio,,$consola$consola,,$min_j$min_j,,$max_j$max_j){){

parentparentparentparentparentparentparentparent::::::::::::::::____constructconstruct(($tit$tit,,$num$num,,$precio$precio); );

$this$this-->consola = >consola = $consola$consola; ;

$this$this-->>min_num_jugadoresmin_num_jugadores = = $min_j$min_j; ;

$this$this-->>max_num_jugadoresmax_num_jugadores = = $max_j$max_j; ;

} }

publicpublic functionfunction imprime_caracteristicasimprime_caracteristicas(){ (){

echo "Juego para: " . echo "Juego para: " . $this$this-->consola . "<>consola . "<brbr>"; >";

parentparentparentparentparentparentparentparent::::::::::::::::imprime_caracteristicasimprime_caracteristicas(); ();

echoecho "<"<brbr>" . >" . $this$this-->>imprime_jugadores_posiblesimprime_jugadores_posibles(); ();

} }

Clase juegoClase juego

Page 40: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

publicpublic functionfunction imprime_jugadores_posiblesimprime_jugadores_posiblesimprime_jugadores_posiblesimprime_jugadores_posiblesimprime_jugadores_posiblesimprime_jugadores_posiblesimprime_jugadores_posiblesimprime_jugadores_posibles()()()()()()()() { {

ifif (($this$this-->>min_num_jugadoresmin_num_jugadores == == $this$this-->>max_num_jugadoresmax_num_jugadores){ ){

ifif (($this$this-->>min_num_jugadoresmin_num_jugadores==1) ==1)

echo "<echo "<brbr>Para un jugador"; >Para un jugador";

elseelse

echo "<echo "<brbr>Para " . >Para " . $this$this-->>min_num_jugadoresmin_num_jugadores . .

" jugadores"; " jugadores";

}}

elseelse { {

echo "<echo "<brbr>De " . >De " . $this$this-->>min_num_jugadoresmin_num_jugadores . " a " . . " a " .

$this$this-->>max_num_jugadoresmax_num_jugadores . " jugadores."; . " jugadores.";

} }

}}

} }

Clase juegoClase juego

Page 41: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► Nos fijamos en el Nos fijamos en el constructorconstructor, que , que llama al constructor de la llama al constructor de la clase padreclase padre para inicializar algunos atributos propios de los para inicializar algunos atributos propios de los soportes en general. soportes en general.

►► También está el También está el método método imprime_jugadores_posiblesimprime_jugadores_posibles()(), que , que muestra los jugadores permitidosmuestra los jugadores permitidos. Ha sido declarado como . Ha sido declarado como publicpublic, , para que se pueda acceder a él desde cualquier lugar. Nos para que se pueda acceder a él desde cualquier lugar. Nos da un da un mensajemensaje como como "Para un jugador""Para un jugador" o o "De 1 a 2 Jugadores""De 1 a 2 Jugadores", , dependiendo de los valores dependiendo de los valores min_num_jugadoresmin_num_jugadores y y max_num_jugadoresmax_num_jugadores..

►► Se redefine la función Se redefine la función imprime_caracteristicasimprime_caracteristicas()(), para mostrar , para mostrar todos los datos de cada juego. Primero se muestra la consola partodos los datos de cada juego. Primero se muestra la consola para a la que se ha creado el juego, después los datos generales (propila que se ha creado el juego, después los datos generales (propios os de la clase soporte) con la llamada al mismo método de la clase de la clase soporte) con la llamada al mismo método de la clase ""parentparent" y el número de jugadores disponibles se muestra con una " y el número de jugadores disponibles se muestra con una llamada al método llamada al método imprime_jugadores_posiblesimprime_jugadores_posibles(). ().

Clase juegoClase juego

Page 42: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► Ejemplo de uso de la clase:Ejemplo de uso de la clase:

$mijuego$mijuego = = newnew juego(“El Padrino", 21, 2.5, "PSP",1,1); juego(“El Padrino", 21, 2.5, "PSP",1,1);

$mijuego$mijuego-->imprime_caracteristicas(); >imprime_caracteristicas();

// Esta línea daría un error porque no se permite acceder a un // Esta línea daría un error porque no se permite acceder a un

// atributo protected del objeto // atributo protected del objeto

// echo "<br>Jugadores: " . $mijuego// echo "<br>Jugadores: " . $mijuego-->min_num_jugadores; >min_num_jugadores;

// Se tendría que crear un método para que acceda a los // Se tendría que crear un método para que acceda a los

// atributos protected // atributos protected

$mijuego$mijuego-->imprime_jugadores_posibles(); >imprime_jugadores_posibles();

echo "<p>"; echo "<p>";

$mijuego2 = new juego(“NBA Live 2007", 27, 3, "Playstation $mijuego2 = new juego(“NBA Live 2007", 27, 3, "Playstation

2",1,2); 2",1,2);

echo "<b>" . $mijuego2echo "<b>" . $mijuego2-->titulo . "</b>"; >titulo . "</b>";

$mijuego2$mijuego2-->imprime_jugadores_posibles(); >imprime_jugadores_posibles();

Clase juegoClase juego

Page 43: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

HERENCIA EN PHP5HERENCIA EN PHP5

►► Nos daría como resultado esto:Nos daría como resultado esto:

Juego para: PSP Juego para: PSP

El Padrino El Padrino 2.5 (IVA no incluido) 2.5 (IVA no incluido)

Para un jugador Para un jugador

Para un jugador Para un jugador

NBA NBA LiveLive 2007 2007 De 1 a 2 Jugadores.De 1 a 2 Jugadores.

Clase juegoClase juego

Page 44: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

La palabra reservada ‘Final'La palabra reservada ‘Final'

►► PHP5 introduce la palabra reservada PHP5 introduce la palabra reservada finalfinal, que puede , que puede tener dos significados según se aplique a un método o a tener dos significados según se aplique a un método o a una clase.una clase.

►► Si un método se declara como final, usando el prefijo Si un método se declara como final, usando el prefijo finalfinalen la definición del método, se obliga a las clases que en la definición del método, se obliga a las clases que heredan a mantener ese método y no poder redefinirlo.heredan a mantener ese método y no poder redefinirlo.

►► Si la clase en sí misma es definida como 'final' entonces no Si la clase en sí misma es definida como 'final' entonces no puede existir ninguna clase que herede de ella.puede existir ninguna clase que herede de ella.

Page 45: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

La palabra reservada ‘Final'La palabra reservada ‘Final'►► classclass ClaseBaseClaseBase {{

publicpublic functionfunction testtest() {() {echo "echo "ClaseBaseClaseBase::::testtest() () llamadallamada\\nn";";

}}

finalfinalfinalfinalfinalfinalfinalfinal publicpublic functionfunction masTestsmasTestsmasTestsmasTestsmasTestsmasTestsmasTestsmasTests() {() {echo "echo "ClaseBaseClaseBase::::masTestsmasTests() () llamadallamada\\nn";";

}}}}

classclass ClaseHijoClaseHijo extendsextendsextendsextendsextendsextendsextendsextends ClaseBaseClaseBaseClaseBaseClaseBaseClaseBaseClaseBaseClaseBaseClaseBase {{publicpublic functionfunction masTestsmasTestsmasTestsmasTestsmasTestsmasTestsmasTestsmasTests() {() {

echo “ClaseHijo::masTests() llamadaecho “ClaseHijo::masTests() llamada\\n";n";}}

}}// Esto es un error: No se puede redefinir el método // Esto es un error: No se puede redefinir el método // final // final ClaseBaseClaseBase::::masTestsmasTests()()

Page 46: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

La palabra reservada ‘Final'La palabra reservada ‘Final'►► final final final final final final final final classclassclassclassclassclassclassclass ClaseBaseClaseBaseClaseBaseClaseBaseClaseBaseClaseBaseClaseBaseClaseBase {{

publicpublic functionfunction testtest() {() {echo "echo "ClaseBaseClaseBase::::testtest() () llamadallamada\\nn";";

}}

// Aquí da igual si se declara el método como // Aquí da igual si se declara el método como

// final o // final o nono

final final publicpublic functionfunction moreTestingmoreTesting() {() {echo "echo "ClaseBaseClaseBase::::moreTestingmoreTesting() () llamadallamada\\nn";";

}}}}

classclass ClaseHijoClaseHijo extendsextendsextendsextendsextendsextendsextendsextends ClaseBaseClaseBaseClaseBaseClaseBaseClaseBaseClaseBaseClaseBaseClaseBase {{}}// Esto es un error: // Esto es un error: ClassClass ClaseHijoClaseHijo no puede no puede heredar de una clase final (heredar de una clase final (ClaseBaseClaseBase))

Page 47: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Alcance del operador de Alcance del operador de resolución (::)resolución (::)

►► El alcance del operador de resolución o en términos El alcance del operador de resolución o en términos simples, simples, dobles dos puntosdobles dos puntos, es un símbolo que permite , es un símbolo que permite accesoacceso a los a los miembros o métodos miembros o métodos staticstatic, , constantesconstantes, , y y “eliminados”“eliminados” (métodos heredados que han sido (métodos heredados que han sido redefinidos) de una clase. redefinidos) de una clase.

►► Cuando se hace referencia a estos elementos desde Cuando se hace referencia a estos elementos desde fuera fuera de la definiciónde la definición de la clase, se ha de usar el nombre de de la clase, se ha de usar el nombre de la clase. la clase.

►► classclass MiClaseMiClase {{constconst VALOR_CTEVALOR_CTE = 'Un valor constante';= 'Un valor constante';

}}

echo echo MiClaseMiClaseMiClaseMiClaseMiClaseMiClaseMiClaseMiClase::::VALOR_CTEVALOR_CTE;;

Page 48: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Alcance del operador de Alcance del operador de resolución (::)resolución (::)

►► Dos palabras reservadas Dos palabras reservadas selfself y y parentparent son usadas para son usadas para acceder a los miembros o métodos desde acceder a los miembros o métodos desde dentrodentro de la de la definición de la clasedefinición de la clase..

►► classclass OtraClaseOtraClase extendsextends MiClaseMiClase {{publicpublic staticstaticstaticstaticstaticstaticstaticstatic $mi_static$mi_static = '= 'staticstatic varvar';';

publicpublic staticstaticstaticstaticstaticstaticstaticstatic functionfunction dosPuntosDoblesdosPuntosDobles() {() {echo echo parentparentparentparentparentparentparentparent::::::::::::::::VALOR_CTEVALOR_CTE . ". "\\nn";";echo echo selfselfselfselfselfselfselfself::::::::::::::::$mi_static$mi_static . ". "\\nn";";

}}}}

OtraClaseOtraClaseOtraClaseOtraClaseOtraClaseOtraClaseOtraClaseOtraClase::::::::::::::::dosPuntosDoblesdosPuntosDobles();();

Page 49: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Alcance del operador de Alcance del operador de resolución (::)resolución (::)

►► Al realizar la herencia a partir de una clase, si se redefine elAl realizar la herencia a partir de una clase, si se redefine elmétodo en la subclase, PHP no llamará el método de la clase método en la subclase, PHP no llamará el método de la clase padre. Es opcional en la subclase decidir si se debe llamar al padre. Es opcional en la subclase decidir si se debe llamar al método de la clase padre o no.método de la clase padre o no.

►► classclass MiClaseMiClase {{protectedprotected functionfunction miFuncmiFunc() {() {

echo "echo "MiClaseMiClase::::miFuncmiFunc()()\\nn";";}}

}}

classclass OtraClaseOtraClase extendsextendsextendsextendsextendsextendsextendsextends MiClaseMiClaseMiClaseMiClaseMiClaseMiClaseMiClaseMiClase {{// Redefine el método de la clase de la que hereda// Redefine el método de la clase de la que heredapublicpublic functionfunction miFuncmiFunc() {() {

// Pero sigue llamando a la función de la clase // Pero sigue llamando a la función de la clase

// ancestro// ancestroparentparentparentparentparentparentparentparent::::::::::::::::miFuncmiFunc();();echo "echo "OtraClaseOtraClase::::miFuncmiFunc()()\\nn";";

}}}}

$clase$clase = = newnew OtraClaseOtraClase();();$clase$clase-->>miFuncmiFunc();();

Page 50: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

La palabra reservada 'La palabra reservada 'StaticStatic''

►► Declarar miembros de clases o métodos como Declarar miembros de clases o métodos como staticstatic, los , los hace hace accesiblesaccesibles desde desde fuera del contexto del objetofuera del contexto del objeto. . Un miembro o método declarado como Un miembro o método declarado como staticstatic no puede no puede accederse con una variable que sea una instancia del accederse con una variable que sea una instancia del objeto y no puede ser redefinido en una subclase. objeto y no puede ser redefinido en una subclase.

►► La declaración La declaración staticstatic debe estar debe estar después de la después de la declaración de visibilidaddeclaración de visibilidad. Por . Por compatibilidadcompatibilidad con con PHP4, PHP4, si no se usasi no se usa la declaración de visibilidad, entonces la declaración de visibilidad, entonces el miembro o método será tratado tal si como se hubiera el miembro o método será tratado tal si como se hubiera declarado como declarado como publicpublic staticstatic. .

►► A causa de que los métodos estáticos son accesibles sin A causa de que los métodos estáticos son accesibles sin que se haya creado una instancia del objeto, que se haya creado una instancia del objeto, la la pseudovariablepseudovariable $this$this nono está está disponibledisponible dentro de los dentro de los métodosmétodos declarados como declarados como staticstatic. .

►► Las propiedades estáticas Las propiedades estáticas no se pueden accederno se pueden acceder a a través del objeto usando el través del objeto usando el operador flecha operador flecha -- >. >.

Page 51: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

La palabra reservada 'La palabra reservada 'StaticStatic''►► classclass FooFoo {{

publicpublic staticstaticstaticstaticstaticstaticstaticstatic $mi_static$mi_static = '= 'foofoo';';

publicpublic functionfunction staticValorstaticValor() {() {returnreturn selfselfselfselfselfselfselfself::::::::::::::::$mi_static$mi_static;;

}}}}

classclass BarBar extendsextends FooFoo {{publicpublic functionfunction fooStaticfooStatic() {() {

returnreturn parentparentparentparentparentparentparentparent::::::::::::::::$mi_static$mi_static;;}}

}}

printprint FooFooFooFooFooFooFooFoo::::::::::::::::$mi_static$mi_static . ". "\\nn";";

$foo$foo = = newnew FooFoo();();printprint $foo$foo-->>staticValorstaticValor() . "() . "\\nn";";printprint $foo$foo-->>mi_staticmi_static . ". "\\nn";";

// "Propiedad" no definida // "Propiedad" no definida mi_staticmi_static// // $foo$foo::::mi_staticmi_static no es posibleno es posible

printprint BarBarBarBarBarBarBarBar::::::::::::::::$mi_static$mi_static . ". "\\nn";";$bar$bar = = newnew BarBar();();printprint $bar$bar-->>fooStaticfooStatic() . "() . "\\nn";";

Page 52: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Constantes de la claseConstantes de la clase

►► Es posible definir valores constantes en cada clase manteniendo Es posible definir valores constantes en cada clase manteniendo el mismo valor y siendo incambiable. Las constantes difieren de el mismo valor y siendo incambiable. Las constantes difieren de las variables normales en que no se usa el símbolo las variables normales en que no se usa el símbolo $$ para para declararlas o usarlas. Como los miembros declararlas o usarlas. Como los miembros staticstatic, los valores , los valores constantes no se pueden acceder desde una instancia de un constantes no se pueden acceder desde una instancia de un objeto (usando objeto (usando $objeto$objeto::constante::constante).).

►► classclass MiClaseMiClase {{constconst constante = 'valor constante';constante = 'valor constante';

functionfunction mostrarConstantemostrarConstante() {() {echoecho selfself::constante . "::constante . "\\nn";";

}}}}

echo echo MiClaseMiClaseMiClaseMiClaseMiClaseMiClaseMiClaseMiClase::constante::constante::constante::constante::constante::constante::constante::constante . ". "\\nn";";

$clase$clase = = newnew MiClaseMiClase();();$clase$clase-->>mostrarConstantemostrarConstante();();// echo // echo $clase$clase::constante;::constante; no se permiteno se permite

Page 53: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Abstracción de objetosAbstracción de objetos

►► PHP 5 introduce PHP 5 introduce clases y métodos abstractosclases y métodos abstractos. . NoNo es es permitido crear una permitido crear una instanciainstancia de una de una claseclase que ha sido que ha sido definida como definida como abstractaabstracta. Cualquier . Cualquier claseclase que contenga que contenga por lo menos por lo menos un método abstractoun método abstracto debe también ser debe también ser abstractaabstracta. Los . Los métodosmétodos definidos como definidos como abstractosabstractossimplemente simplemente declaran el métododeclaran el método, , nono pueden pueden definir la definir la implementaciónimplementación..

►► Cuando Cuando se hereda se hereda desde una desde una clase abstractaclase abstracta, , todos todos los métodoslos métodos marcados como marcados como abstractosabstractos en la en la declaración de la clase padre, declaración de la clase padre, deben de ser definidosdeben de ser definidos en en la subclase; adicionalmente, la subclase; adicionalmente, estos métodosestos métodos se deben se deben definir definir con la misma o mayor con la misma o mayor visibilidadvisibilidad. Si el método . Si el método abstracto es definido como abstracto es definido como protectedprotected, la implementación , la implementación de la función debe ser definida como de la función debe ser definida como protectedprotected o o publicpublic. .

Page 54: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Abstracción de objetosAbstracción de objetos►► abstractabstractabstractabstractabstractabstractabstractabstract classclass ClaseAbstractaClaseAbstracta {{

// Se fuerza la herencia de la clase para definir // Se fuerza la herencia de la clase para definir // estos métodos// estos métodosabstractabstractabstractabstractabstractabstractabstractabstract protectedprotected functionfunction tomarValortomarValor();();abstractabstractabstractabstractabstractabstractabstractabstract protectedprotectedprotectedprotectedprotectedprotectedprotectedprotected functionfunction prefixValorprefixValor(($prefix$prefix););

// Método común// Método comúnpublicpublic functionfunction printOutprintOut() {() {

printprint $this$this-->>tomarValortomarValor() . "() . "\\nn";";}}

}}

classclass ClaseConcreta1ClaseConcreta1 extendsextendsextendsextendsextendsextendsextendsextends ClaseAbstractaClaseAbstractaClaseAbstractaClaseAbstractaClaseAbstractaClaseAbstractaClaseAbstractaClaseAbstracta {{protectedprotected functionfunction tomarValortomarValor() {() {

returnreturn ""ClaseConcreta1ClaseConcreta1";";}}

publicpublicpublicpublicpublicpublicpublicpublic functionfunction prefixValorprefixValor(($prefix$prefix) {) {returnreturn "{"{$prefix}ClaseConcreta1$prefix}ClaseConcreta1";";

}}}}

Page 55: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Abstracción de objetosAbstracción de objetos►► classclass ClaseConcreta2ClaseConcreta2 extendsextendsextendsextendsextendsextendsextendsextends ClaseAbstractaClaseAbstractaClaseAbstractaClaseAbstractaClaseAbstractaClaseAbstractaClaseAbstractaClaseAbstracta {{

protectedprotected functionfunction tomarValortomarValor() {() {returnreturn ""ClaseConcreta2ClaseConcreta2";";

}}

publicpublicpublicpublicpublicpublicpublicpublic functionfunction prefixValorprefixValor(($prefix$prefix) {) {returnreturn "{"{$prefix}ClaseConcreta2$prefix}ClaseConcreta2";";

}}}}

$class1$class1 = = newnew ClaseConcreta1ClaseConcreta1;;$class1$class1-->>printOutprintOut();();echo echo $class1$class1-->>prefixValorprefixValor('FOO_') ."('FOO_') ."\\nn";";

$class2$class2 = = newnew ClaseConcreta2ClaseConcreta2;;$class2$class2-->>printOutprintOut();();echo echo $class2$class2-->>prefixValorprefixValor('FOO_') ."('FOO_') ."\\nn";";

Page 56: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Abstracción de objetosAbstracción de objetos

►► El resultado del ejemplo seria:El resultado del ejemplo seria:

ClaseContreta1ClaseContreta1

FOO_ClaseConcreta1FOO_ClaseConcreta1

ClaseConcreta2ClaseConcreta2

FOO_ClaseContreta2FOO_ClaseContreta2

Page 57: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Interfaces de objetosInterfaces de objetos

►► Las interfaces de objetos permiten Las interfaces de objetos permiten crear códigocrear código el cual el cual especifica especifica métodosmétodos que que una clase debe implementaruna clase debe implementar, sin , sin tener que definir cómo serán manejados esos métodos. tener que definir cómo serán manejados esos métodos.

►► Las interfaces son definidas usando la palabra reservada Las interfaces son definidas usando la palabra reservada interfaceinterface, de la misma manera que las clases estándar, pero , de la misma manera que las clases estándar, pero sin que cualquiera de los métodos tenga su contenido sin que cualquiera de los métodos tenga su contenido definido. definido.

►► Todos los Todos los métodos en una interfazmétodos en una interfaz deben ser deben ser públicospúblicos, , esto es la naturaleza de una interfaz. esto es la naturaleza de una interfaz.

►► Para Para implementar una interfazimplementar una interfaz, se usa el operador , se usa el operador implementsimplements. . Todos los métodosTodos los métodos en la en la interfazinterfaz deben ser deben ser implementadosimplementados dentro de dentro de una claseuna clase; de no hacerse así ; de no hacerse así resultará en error fatal. Las resultará en error fatal. Las clasesclases pueden pueden implementarimplementarmás de una interfazmás de una interfaz si se desea, al separar cada interfaz si se desea, al separar cada interfaz con una coma. con una coma.

Page 58: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Interfaces de objetosInterfaces de objetos►► // Se declara la interfaz '// Se declara la interfaz 'iTemplateiTemplate''

interfaceinterfaceinterfaceinterfaceinterfaceinterfaceinterfaceinterface iTemplateiTemplateiTemplateiTemplateiTemplateiTemplateiTemplateiTemplate {{publicpublic functionfunction ponerVariableponerVariableponerVariableponerVariableponerVariableponerVariableponerVariableponerVariable(($nombre$nombre, , $var$var););publicpublic functionfunction verHtmlverHtmlverHtmlverHtmlverHtmlverHtmlverHtmlverHtml(($template$template););

}}

// Se implementa la interfaz// Se implementa la interfaz// Esto funcionará// Esto funcionaráclassclass TemplateTemplate implementsimplementsimplementsimplementsimplementsimplementsimplementsimplements iTemplateiTemplateiTemplateiTemplateiTemplateiTemplateiTemplateiTemplate {{

privateprivate $vars$vars = = arrayarray();();

publicpublic functionfunction ponerVariableponerVariableponerVariableponerVariableponerVariableponerVariableponerVariableponerVariable(($nombre$nombre, , $var$var) {) {$this$this-->>varsvars[[$nombre$nombre] = ] = $var$var;;

}}

publicpublic functionfunction verHtmlverHtmlverHtmlverHtmlverHtmlverHtmlverHtmlverHtml(($template$template) {) {foreachforeach(($this$this-->>varsvars as as $nombre$nombre => => $value$value) {) {

$template$template = = str_replacestr_replace('{' . ('{' . $nombre$nombre . . '}', '}', $value$value, , $template$template););

}}

returnreturn $template$template;;}}

}}

Page 59: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

Interfaces de objetosInterfaces de objetos

►► // Esto no funcionará// Esto no funcionará// Error: // Error: ClassClass MalTemplateMalTemplate contiene 1 métodocontiene 1 método

// abstracto y por tanto, debe ser declarada// abstracto y por tanto, debe ser declarada

// como abstracta (// como abstracta (iTemplateiTemplate::::verHtmlverHtml))

classclass MalTemplateMalTemplate implementsimplementsimplementsimplementsimplementsimplementsimplementsimplements iTemplateiTemplateiTemplateiTemplateiTemplateiTemplateiTemplateiTemplate {{privateprivate $vars$vars = = arrayarray();();

publicpublic functionfunction ponerVariableponerVariableponerVariableponerVariableponerVariableponerVariableponerVariableponerVariable(($nombre$nombre, , $var$var) {) {$this$this-->>varsvars[[$nombre$nombre] = ] = $var$var;;

}}}}

Page 60: ORIENTACIÓN A OBJETOS EN PHP5 - lsi.ugr.eslsi.ugr.es/~pdo/Seminarios/php5_2007.pdf · Algunas características del trabajo con POO en PHP 5 1.-Nombres fijos para los constructores

BibliografíaBibliografía

►► http://www.php.net/http://www.php.net/ (Sitio (Sitio webweb oficial, en inglés)oficial, en inglés)►► http://www.desarrolloweb.com/manuales/58/http://www.desarrolloweb.com/manuales/58/ (Manual de (Manual de PHP5 sobre objetos)PHP5 sobre objetos)

►► http://es.php.net/manual/es/language.oop5.phphttp://es.php.net/manual/es/language.oop5.php (Manual (Manual de PHP5 sobre objetos)de PHP5 sobre objetos)

►► http://www.zonaphp.com/programacionhttp://www.zonaphp.com/programacion-- orientadaorientada-- aa--objetosobjetos-- enen-- php/php/ ((BlogBlog sobre orientación a objetos en PHP)sobre orientación a objetos en PHP)

►► http://www.webestilo.com/php/articulo.phtml?art=27http://www.webestilo.com/php/articulo.phtml?art=27(Nociones básicas sobre orientación a objetos en PHP)(Nociones básicas sobre orientación a objetos en PHP)

►► http://www.programacion.net/php/http://www.programacion.net/php/ (Foro en español de (Foro en español de PHP)PHP)

►► http://phphttp://php-- hispano.net/hispano.net/ (Foros y artículos sobre PHP, en (Foros y artículos sobre PHP, en español)español)