Está en la página 1de 30
PHP orientado a objetos 1: encapsulacién Introdu én a la POO en PHP (1). En esta entrada veremos qué son los métodos y propiedades de una clase. archivade en: PHP/AJAK || 12 neviembre, 2012 || serie: PHP orientado a objetos En esta entrada vamos a empezar @ conocer cémo funciona la programacién orientada a objetos en PHP, una manera ce desarrollar en este lenguaje de forma mucho més ordenada y eficaz, pero antes es importante que hablemos de Platén. Enla Republica, este filbsofo griego planteé la teoria de las ideas, que viene a decir que los abjetos del mundo material no son sino copias imperfectas del modelos ideales que si son perfectos. Por ejemplo, en la idea de dinosaurio, en la dinosauriez, esté comprendido tado lo que puede ser un dinosaurio: un bicho que come, se reproduce, pone huevos, es muy grande, tiene un color... Luego estén, o estaban, cada uno de los dinosaurios en concreto, con sus caracteristicas particulares. Unos tlenen cuernos, otros escamas, otros plums, algunos son verdes, otros grises, unos muy grandes, otros més pequefios, Las clases son lo mismo que las ideas platénicas, entidades que retnen todas laspropiedades y métodos que pueden tener los abjetos concretos. Por ejemplo, en la clase dinosaurio podrian estar definidas las propiedades de color, peso, altura y los métodos de correr, comer, reproducirse... 0 si esa de atributes y métodos nos lia, pedemos hablar de variables (y constantes) y funciones, que pare el caso es lo mismo, Dicho de otra forma, una clase es un conjunto de funciones, llamadas métodos, y de variables, denominadas propiedades, que se puede «invacar» desde cualquier parte del cédigo... como una superfuncién, para aclararnos. Esto se entlende mejor sl empezamos a ver un poco de sintaxis. Declaracién de clase Para deciarar una clase se utiliza la expresién class: class dinosaurios { // aqui una montonera de funciones (métodos) y variables (propiedades). y Y para acceder @ sus propledades es necesario «invocarla» creando una instancia, una copia de la original, mediante la palabra clave new. $triceratops = new dinosaurio(); Esta copia de la clase, que tendré a partir de ahora sus propias caracteristicas, se denorina objeto. En el caso anterior hemos declarado un nuevo abjeto llamado Striceratops, pero si necesitamos mas bichos grandes y voraces en nuestro script podemos declarar nuevos objetos de la clase dinosaurio. Striceratops = new dinosaurio(); $velocirraptor = new dinosaurio(); ‘Aunque Striceratops y Svelociraptor son de la misma clase (dinoseuri), cada uno es cistinto y ye veremos para qué sirve esto @ Acceder a los métodos (->) Los objetos pueden usar los métodos de su clase, sus funciones, mediante el operador =>. Por ejemplo, vamos a afiadir una funcién a Ia clase dinosaurios que devuelva Ie cadena de texto "soy un dinosaur class dinosaurios { function cadena_de_texto_dinosaurio () { return "soy un dinosaurio"; > > Y ahora accedemos @ esa funcién mediante el operador => $triceratops = new dinosaurios (); ‘echo "2Qué es $triceratops?"; ‘echo $triceratops=> cadena_de_texto_dinosaurio (); Un script formidable que daria como resultado en pantalla: 2Qué es $triceratops? soy un dinosaurio Acceder a las propiedades Las clases pueden incluir variables, que reciben el nombre de propiedades o atributes, y para declararlas antes era obligatorio anteponer la palabra reservada Svar, aunque ya no es necesario. ‘Al Igual que sucede con los métodos, las propledades pueden ser: + Pablicas (public): Los elementos son accesibles desde dentro y desde fuera de la clase. + Protegidas (protected): Los elementos son accesibles desde le misma clase y en sus subclases. + Privadas (private): Los elementos solo son accesibles dentro de Ie clase. Por integridad de la aplicacién, en general, lo mas recomendable es declararias como protegidas o privadas, Esto es lo que se conoce en la programacién orientada a ot 05 como eneapsulamiento: se aislan determinados métodos y propledades para que sole funcionen dentro de la clase, de tal manera que no puedan ser alterados de forma accidental en alguna parte del cédigo, Seguimos, para referirse a las propledades que estan dentro de la clase es necesarlo emplear la pseudovariable $this: Sthis->variable Por ejemplo, esto daria error: lass dinosaurios ( protected $nombre ="triceratops"; function nombre_dinosaurio () { return $nombre; // se vuelve idiota: Undefined variable y 3 Pero esto devolveria “triceratops™ class dinosaurios { protected $nombre ="triceratops"; function nombre_dinosaurio () { return $this->nombre; > > EI método_construct() Las clases suelen seguir esta estructura 1. Primero se declaran las propiedades 2. Luego la funcién constructora 3. Las funciones que trabajan algo 4. Las que devuelven algo La funcién constructora sirve para inicializar el objeto que se ha creado y con PHPS se declara escribiendo dos guiones bajos seguicos de Ia palabra construct —construct() Antes, en vez de_construct(), se denominaba @ la funcién de la misma forma que la clase Bueno, ya volveremos sobre este método y su opuesto (__destruct()}, ahora veamos un ejemplo pequefio que recoge todo lo expuesto haste aqui: una microaplicacién para calcular cuénto dinero hay que quitar de IRPF en una factura, El cédigo es sencillo, con la funcién constructora recogemos los pardmetros que se declaran al inicializar la clase, es decir, al crear un nuevo objeto. Estos dos parémetros son el dinero total de la factura (brute) y el IRPF @ descontar. Una vez iniclalizado el objeto (lineas 6 a 9), calculamos el tanto por clento y devolvemos la miseria resultante. 12. 13, 14. 15. 16. v7. 18, 19. 20. class Facturometro { private $irpf; // La cantidad a descontar private $bruto; // El total a pagar private glimplo; // La miserla que te queda // Recogemos los datos inicializando el nuevo abjeto public function __construct ($rec_Irpf, $rec_bruto) { 1. Sthis->iepf = $rec_inpf; - Sthis->bruto °. 10. a. rec_bruto; y 1/ Procesamos y devolvemos los datos public function devuelve_factura () ¢ Sirpt_a_descontar = ($this->bruto*$thi >irpf)/100; Sthis->limplo = $this->bruto-Sirpf_a_descontar; return $this->limpio; > y 1/Creamos el objeto $nueva_factura enviéndole el IRPF y la cantidad bruta ‘snueva_factura = new Facturometro (21, 1000); // Uamamos al método devuelve_factura ‘echo $nueva_factura ->devuelve_factura (); Otro dia seguimas, de momento vamos a dejarlo aqui PHP orientado a objetos 2: ocultacién, getter y setter ‘Segunda entrada de la serie dedicada a PHP orientada a objetos: la ventaja de ocultar las cosas. En la primera entrada de esta serie dedicada a PHP orientado a objetos vimos qué una Ge las virtudes de esta manera de programar era tener «encapsulados», agrupados, los métodos (funciones) y propiedades (variables) de una misma entidad, es decir, las cosas que sirven para lo mismo. Una de las ventajas de encapsular los elementos de una entidad es que podemos «ocultar», proteger, los que no se necesitan fuera de la clase. Esto nos puede parecer trivial para los que venimos del desarrollo de webs narmales, paginas corporativas de contenidos, en las que normalmente escribe uno mismo desde la primera hasta la ditima linea del cédigo, pero cuando la aplicacin es monstruosa e intervienen varias manos resulta més clara su utilidac Entao, como vimos, las propiedades de una clase pueden ser pablicas (public), protegidas (protected) o privadas (private). Es lo que se conoce como «métodos de acceso». Segtin se especifique uno u otro a la hora de declarar le propledad, se podré Desde fuera de la clase, solo podriamos acceder a la primera propiedad, la que esté declarada como public. Asi, esto: $compruebaMetodos = new MetodosAcceso(); ‘echo $compruebeMetodos->variable1; devolveria en pantalla «1 Pero si intentéramos hacer lo mismo con las otras dos o nos daria un error fatal y con clerta impudicia el servidor nos responderia que «Cannot access private property». Lo normal es que declaremos las propiedades protected o private, dado que para eso estén las clases, y solo permitamos que se accedan a las que se necesitan de verdad fuera y cuando y cémo se necesiten; para lo cual conviene emplear los denominades métodes getter (que se podria traducir como accesar o lector) ysetter, (definidor © modificador) Mediante e1 método que se usa de getter se permite leer, y solo leer, las propiedades que se necesiten y mediante el método que se emplee de setter, el modificarlas. Y solo se podrén leer 0 modificar desde fuera a partir de estos dos métodos. Esto queda claro con el sigulente ejemplo utilisérrimo en la vida real. Imaginemos que tenemos una clase con dos propiedades, en una se define la velocidad de los triceratops y en otra, mediante un array, lo que comen. class Triceratops < private $velocidad = 20; private galimentacion = array (*helechos", "eucaliptus > ‘Afios de investigacién nos han permitido saber con certeza cudl es su velocidad media, pero no estamos tan seguros de lo que comian realmente, por lo que de momento solo queremos que se pueda saber desde fuera cuanto corrian. Asi, vamos a crear un método getter que lea la velocidad, mientras que la alimentaci6n quedaré oculta pues —al ser una propiedad private y carecer de ningiin método que la lea—, no hay forma de acceder a ella desde fuera de la clase. class Triceratops ¢ private $velocidad = 20; private $alimentacion = array (“helecho: Public function getVelocidad() { return $this->velocidad; > > $mi_Triceratops = new Triceratops(); ‘echo $mi_Triceratops->getVelocidad(); 1/ obtendriamos 20. “eucaliptus" Y, silo que queremos es modificar Ia velocidad, podemos hacerlo mediante un método con funciones setter: class Triceratops ¢ private $velocidad = 20; private $alimentacion = array ("helechos", “eucaliptus", "musgo"); Public function getVelocidad() { return $this-> velocidad; y Public function setVelocidad($nueva_velocidad) { Sthis->velocidad = $nueva_velocidad; > > $mi_Triceratops = new Triceratops(); $mi_Triceratops->setVelocidad(30); ‘echo $mi_Triceratops->getVelocidad(); 1/ ahora obtendriamos 30, Una ventaja de hacerlo asi, de concentrar el acceso @ las propiedades a partir de un solo método piblico, es que si luego queremos aplicar una restriceién © cualquier otra historia antes de cambiar la propiedad, solo tenemos que acudir a un sitio. Los métodos magicos __get y__set En la entrada anterior conocimos el método «magico» _construct, que servia para inicializar una clase sin necesidad de llamar 2 ningtin método en concreto, No es el tnico. Hay otros métados «magicos, que es como se denominan unos métodos especiales que hacen cosas de forma genérica, sin necesidad de especificar el nombre de la funcién en concreto, Se reconocen porque empiezan siempre por dos gulones bajos: _nombreMétodoMagico. Hay dos métodos magicos que cumplen las funciones de getter y setter, que son respectivamente __get y__set. Mediante _get podemos leer cualquier propiedad de une clase, aunque sea private o protected. class Triceratops ¢ private $velocidad = 20; private galimentacion = array (*helechos", “eucaliptus", "musgo"); public function __get($name) ¢ return $this->$name; > y $mi_Triceratops = new Triceratops(); 0 devolveria 20, ‘echo $mi_Triceratops-> velocidad; II y sto otro "h hos ‘echo $mi_Triceratops-> alimentacion[0}; Lamar $name al parémetro de __get da igual, es una convencién, ahi podriamos haber puesto Sturumbulillos. Lo Importante es fjarse en que con este método podemos acceder a cualquler propiedad ce la clase Tricerarops, sea 0 no pabiica, El método __set funciona de manera similar, solo que hay que pasarle dos pardmetras, uno con la propiedad a modificar y otro con el valor que debe tomar esa propiedad. class Triceratops ¢ private $velocidad = 20; private galimentacion = array ("helecho: public function __get($name) { return $this-> $name; > public function __set($name, $value) { return $this->$name = $value; > > $mi_Triceratops “eucaliptus" 1ew Triceratops(); JI cambiamos la velocidad a 30 ‘$mi_Triceratops->velocidad = 30; ‘echo $mi_Triceratops->velocidad; El problema de usar estos dos métodos magicos, como ya se habré deducido, es que se puede acceder a todas las propledades, que para el caso es como si se hubieran declarado piblicas, perdiendo asi las ventajas de la ocultacién. Retomemos el ejemplo del facturémetro del post anterior para terminar de comprender las ventajas de que algunas propiedades permanezcan ocultas y solo se pueda acceder a las demas mediante métodos especiticos. Recordemos que era una aplicacién que calculaba el importe que nos quedaba en una factura una vez que hubiéramos deducido el Impuesto IRPF. class Facturometro { private girpf; // La cantidad a descontar private $bruto; // El total a pagar private $limpio; // La miseria que te queda 1/ Recogemos los datos inicializando el nuevo abjeto public function __construct ($rec_Irpf, $rec_bruto) { $this->irpf = Srec_inpf; Sthis->bruto = Srec_bruto; y public function devuelveFactura () Sirpt_z ‘$this-> bruto*sthis->irpf)/100; $this->limpio = $this->bruto-Sirpf_a_descontar; return $this->limpio; > > //Creamos el objeto $nueva_factura enviéndole el IRPF y la cantidad br $nuevaFactura = new Facturometro (21, 1000); // Uamamos al método devuelveFactura descontar ‘echo $nuevaFacture ->devuelveFactura (); Imaginemos ahora que en vez de ser el usuario quien indica el IRPF a descontar, este debe ser siempre el mismo, el Indicado por Hacienda y no queremos que nadie lo varie accidentalmente. Si uséramos el método __set o sile paséramos ese parémetro en el constructor, tal y como estd escrito, estariamos permitiendo que algulen lo cambiase. En cambio, de class Facturometro ¢ private girpf private $bruto; // El total a pagar private $limpio; // La miseria que te queda // ELIRPF se puede leer, pero no modificar public function getirpf () ¢ return $this->irpf; > // €l bruto se puede cambiar 1; // La cantidad a desconter public function setBruto ($nuevo_bruto) { sthis->brut > snuevo_pruto; public function devuelveFactura () { Sirpt_z descontar = ($this->bruto*$this->irpf)/200; $this->limpio = $this->bruto-$irpf_a_descontar; return gthis->limpio; > > 1/ Creamos el ot -0 $nueva_factura sin enviar nada S$nuevaFactura = new Facturometro (); / Indicamos el bruto con un método con funciones setter $nuevaFactura->setBruto(100); /] Uamamos al método devuelve_factura ‘echo $nuevaFactura->devuelveFactura (); fl IRFP permanece numeroA + $this->numeroB; y Esta clase solo sirve si necesitamos el nimero 7. Es incapaz de hacer nada més, por lo que solo podriamos usarla en casos muy coneretos. En cambio esta otra class Sumar « private $numeroA; private $numeroB; public function __construct (finicializaNumeroA, SinicializaNumeroB) { >numeroA = $inicializaNumeroA; >numeroB = SinicializaNumero8; public function devuelveSuma() { return $this->numeroA + $this->numeroB; les mucho mas util, ya que permite sumar dos nlimeros cualesqulera: $miSuma = new Sumar (3, 4); ‘echo $miSuma->devuelveSuma(); Entao, para que las clases sean lo mas genéricas posible y, ademas, cada una se ocupe de lo suyo, es importante que se puedan relacionar entre si, lo cual se puede hacer de dos maneras: mediante la colaboracién, que es lo que vamos a ver en esta entrada, y mediante la herencia, como veremos en la siguiente de esta serie. Combate fatal En la linea de desarrollo de clases utllisimas para la vida real, vamos @ preparar una aplicacién que calcule las posibilidades de supervivencia de un estegosaurio contra un velocirraptor, En un primer momento, pedriamos pensar que necesitames tres clases, una para el estegosaurio, otra para el velocirraptor y una tercera para calcular el resultado del encuentro, pero eso seria incurrir en el modo chapucero que explicaba antes, ya que los dos bichos pueden encuadrarse en la misma clase dinosaurios, pues solo varian sus parémetros particulares, no sus generalidades (los dos comen, tienen color, tienen fuerza...) Asi, de momento solo necesitamos una clase que defina cada objeto dinosaurio: class Dinosaurios < private sfuerza; public function __construct($inicializaFuerza) { $this->fuerza = SinicializaFuerza; > public function devuelveFuerza () < return $this->fuerza; > > ‘Ahora solo tenemos que crear los dos obj .0s-dinosaurlo, cada uno con su propia fuerza, pero no vamos a hacerlo en cualauier lado, sino en otra clase que colaboraré con la primera. Es decir, desde la clase CalculaEncuentro vamos a llemar a la segunda para iniciaizar los objetos-Dinosauro. class CaleulaEneuentro < public function calculador() { $mi_estegosaurio = new Dinosaurios (30); SfuerzaEstegosaurio = $mi_estegosaurio->devuelveruerza(); $mi_velocirraptor = new Dinosaurios (10); $fuerzaVelocirraptor = $mi_velacirraptor->devuelveruerza(); If (Sfuerzatstegosaurio > sfuerzaVelocirraptor ) { return "ha ganado el estegosaurio"; yelse ¢ return "ha ganado el velocirraptor"; > > ; Y ya sien el cédigo normal de la pagina creamos un objeto CalculaEncuentro: $mi_calculeencuentro = new CalculaEncuentro (); ‘echo $mi_calculaencuentro->calculador(); En realidad, este ejemplo no seria correcto, ya que lo suyo es que la clase CalculaEncuentro fuera mas general, pero me sirve para mostrar cémo se crea un objeto dentro de una clase para 108200000, "saturna'=>108200000, "Urano'=> 108200000, 'Neptuno'= > 108200000, "Pluton’=> 108200000); public function getterPlaneta (SrecogePlaneta) { $distanciaPlaneta = $this->arrayPlanetas[srecogePlaneta]; return $distanciaPlaneta; > > b) Otra es muy similar, pero con Ia velocidad de los vehiculos class vehiculos < private $arrayVehiculos = array (’Monopatin'=>2, "Submarino'=>98); public function getterVehiculo ($recogeVehiculo) < $velocidadVehiculo = $this-> arrayVehiculos[srecogeVehiculo]; return $velocidadvehiculo; ©) Y la tercera es la que se encarga de realizar la operacién: class calculavelocidad { public function devuelveResultado ($recogePlaneta, $recogeVehiculo) { $mi_planeta Sdistancia 1ew planetas(); mi_planeta->getterPlaneta($recogePlaneta); $mi_vehiculo = new vehiculos(); $velocidad = $mi_vehiculo->getterVehiculo($recageVehiculo); return ($distancia/Svelocidad)/24; 4) ¥ ya solo nos faltaria crear un abjeto $calculavelocidad $mi_calculaVelacided = new calculavelocidad (); ‘echo "Hasta" $planeta. " en ".Svehiculo.” vas a tardar: ‘echo $mi_calculaVelocidad->devuelveResultado($planeta, $vehiculo); ‘echo " dias"; En sinte: + Cada clase deberia + Es mejor que las clases sean lo mas genéricas posibles y sus posibilidades no se reduzcan @ solucionar algo en ir para una sola cosa, concrete. + Para que las clases colaboren entre si se pueden crear objetos dentro de una clase. En la préxima entrada veremos qué es la herencia y ya en la siguiente cémo colocar cada clase en su proplo archive sin volvernos tarumbas con tresclentos mil requires, PHP orientado a objetos 4: herencia I La herenei es un concepto clave de la programacién orientada a objetos, una técnica que permite ahorrar mucho trabajo. archivade en: PHP/AIAX || 6 marzo, 2013 || sene: PHP orientad a objetos En la entrada anterior de esta serie vimos cémo pueden colaborar entre si las distintas clases declarando objetos de una clase dentro de otra. En esta verermos otra manera en que se pueden relacionar: mediante la herencia, que es otro pillar fundamental de la programacién orientada a objetos. ‘Se denomina herencia a la capacidad de una clase de emplear todos los métodos y propiedades de otra clase, lo cual se consigue en PHP mediante la palabra reservada extends. Por ejemplo, si tenemos esta clase: class padre < public function saluda() { echo "Hola Mundo"; > Y luego Ia extendemos 2 otra: class hija extends padre < y Podriamos usar todos los métodos y propiedades de la clase padre, pues han sido sheredados» por la hija. Asi, esto, $mi_hi new hija(); $mi_hija->saluda(); ssdevolveria por pantalla "Hola Mund clase padre. , Bunque la clase hija carezca de métodos y propiedades, pues los ha recibido de la 2 para qué diantres sirve esto?», podemos preguntamnos entonces, si ya tenemos la clase padre que hace eso. Muy sencillo: para ahorramnos muchisimo cédigo mediante la sobrescritura de métados y propiedades, Sobrescritura de métodos Una de las bondades de la herencia es que pademos ampliar o redefinir algunas funcionalidades de la clase original, por lo que parte del cécigo se puede reciclar, ahorrandonos mucho esfuerzo tanto en el desarrollo, como en el mantenimiento, Es por ejemplo como se realizan los widgets de WordPress a partir de una clase original llamada WP_Widget. Esto se comprende bien con con el caso de antes si afiadimos una funci6n a la clase hije que devuelva el saludo class hija extends padre < public function respondeSaludo() { echo "
Hola aplicacién"; > > ‘Ahora la clase hija tlene una funcionalidad afadida respecto a la padre. Ya hace dos cosas, pero solo hemos tenido que escribir una, $mi_hija = new hija(); $mi_hija->saluda(); $m\_hija->respondeSaludo(); Pero también podemos cambiar las funcionalidades originales reescribiends los métodos. Asi, por ejemplo, si quisiéramos que dijera «Hola Venus» en vez de «Hola Mundo», solo tendriamos que redefinir el método en la clase hija: class hija extends padre < public function saluda() < echo "Hola Venus"; y public function respondeSaludo() { echo "
Hola aplicacién"; > > \Veamos otro ejemplo para terminar de entender esto, Imaginemos que tenemos una clase llamada operacion que sive para sumar dos nlimeros, Fijaos que las propiedades estén definidas como protected, para que puedan ser accesibles por las clases hijas. class operacion < protected $numero1; protected Snumero2; public function __construct($numerot, $numero2) { Sthis->numerol = $numerot; numero2; Sthis->numero2 > public function operacion() { return sthis->numerot + $this->numero2; > Asi, por ejemplo, esto devolveria 12: $mi_suma = new operacion(8, 4); ‘echo $mi_suma->operacion(); Pero reescriblendo la clase, podemos conseguir que reste en vez de sumar. Fij2os en que no es necesario declarer el método constructor en la clase hija, pues lo hereda de la clase padre class resta extends operacion < public function aperacion() { return $this->numerol - sthis->aumero2; > > Y este objeto ahora daria 4 $mi_resta = new resta(8, 4); ‘echo $mi_resta->operacion(); Bueno, queda mucho mds por contar de la herencia, pero de momento vamos @ dejarlo aqut. Seguiré con esta cuestién en la préxima entrada de esta serie, donde conaceremos qué es el misterioso operador Paamayim Nekudotayim :P. PHP orientado a objetos 5: herencia II ‘Segunda parte de la entrada dedicada a la herenci archivado en: PHP/AJAX || 17 marzo, 2013 || sere: PHP onentado a abjetos Seguimos con la serie de PHP orientado a objetos. En la entrada anterior vimos cémo una clase puede heredar los métodos ¥ propiedades de otra mediante la palabra clave extends y, ademés, aprendimos a reescribir los métodos y propiedades de la clase padre, que es algo tan sencillo como redefinirlos en la clase hija. class ClasePadre « protected Spropiedad ="soy un gato” public function metodo() { return sthis-> propiedad; > > class ClaseHija extends ClasePadre “ protected $propiedad ="soy un ratén"; > $mi_ClasePadre = new ClasePadre(); ‘echo $mi_ClasePadre->metodo(); 1/ Esto da como resultado: "soy un gato $mi_Claselija = new ClaseHija(); ‘echo $mi_ClaseHija->metodo(); 1/ Esto da come resultado: "soy un ratén" En la entrada anterior utilicé como ejemplo una calculadora en la que la clase padre sumaba y la hija restaba. < protected $numerot; protected snumero2; public function __construct($numerot, $numera2) { Sthis->numerod numeral; numero2; Sthis->numero2 > public function operacion() { return Sthis->numerot + $this->numero2; > > class resta extends operacion < public function operacion() { return $this->numerot - $this->numero2; > Pero ahora imaginemos que necesitamos que la clase hija también sea capaz de sumar, es decir, de elecutar las instrucciones que habia en un método original de la clase padre que ha sido redefinida. Para eso podemos usar el operador Paamayim Nekudotayim, cuyo nombre mas prosaico es operador de resolucién de alcance akados puntos dobles para los arnigos. Combinado con la palabra parent, este operador nos permite recuperar los métodos de la clase padre, Asi, por ejemplo, si necesitéramos en el caso anterior que Ia clase hija también fuera capaz de sumar, que era el método operacion de la clase padre, podriamos escribir algo asi public function operacion2() { return parent: operacion(); Y ahora ya pocriamos utilizar el método original para lo que sea.. $mi_Resta resta (4, 3); I esto da 1 echo $mi_Resta->operacion(); I esto da 7 ‘echo $mi_Resta->operacion2(); Herencia miltiple Un detalle més antes de terminar esta entrada. En PHP, una clase puede ser heredera de una clase que ya es una extension de otra (aunque no es saludable que el érbol vaya més allé de unos 7 niveles); y, por supuesto, una misme clase puede ser heredada por varias. Sin embargo, no es posible que une clase sea heredera de otras dos, lo cual es objeto de discusién entre los especialistas sobre si es una faena a una virtud (ver discusién en foros de! web, sobre todo los post de Enrique Place, que es un crack) 7 Es decir, B puede ser una clase hija de A y, a su vez, sera clase padre de C. Dos clases, como B y C pueden ser herederas de A. Pero C no puede ser heredera de Ay B. Y por hoy vamos a dejarlo aqui No me lo puede creer! PHP orientado a objetos 6: autoload En esta entrada veremos cimo guardar cada clase en un archive y no morr en el intent [15 Pace: PAP roman actos SSigo con la serie de PHP orlentado a objetos. Como ya he menclonado, salvo alglin caso excepclonal, le mas limpio es guardar cada clase en un archivo, el cual debe tener el mismo nombre de la clase. Y cuanda digo el mismo es el mismo, incluidas las ‘mayisculas: la clase Mi_Clase_Superchula se guarda en Mi_Clase_Superchula.php. YY 2 partir de aqui empieza el jaleo: ) En teoria, para que las clases puedan interactuar bastaria con incluirlas todas al principio del documento, en el index.php o la pagina en la que se necesiten, con la funcién require(), que inserta un archivo dentro de otro. Pero no es tan sencill, ya que esta solucin presenta algunos problemas, Imaginemes que tenemos el siguiente escenario: Clase 4 + clase2 | | clases | clases + claseé | | clases Las flechas muestran una relacién de dependencia. En la pagina solo necesitamos la clase1, aunque esta a su vez necesite otras que necesitan de otres. Si cargamos todas de golpe en index.php, estariamos incluyendo la clase 6, que no necesitamos, por lo ue pare optimizar habria que ir viendo pagina por pagina qué clases dependen de cudles. 0 lo que seria peor ain, 2qué ocurre si necesitamos una sola clase en otro archiva que no sea index.php? éHay que cargarlas todas de nuevo? En fin, un to. Por esta razén y otras que no vienen al caso, es mucho mejor que cada clase sea independiente, totalmente auténoma; lo cual se puede conseguir empleande los require() pertinentes a cada clase en el archivo carrespondiente. ‘Ahora bien, si lo hacemos asi tenemos otro problema y es que si tratamos de insertar con require el mismo archivo das veces nos a error. Asi, por ejemplo, en el escenario de antes, se produciria un error si por lo que sea se incluye la clase 5, que llama ala 4, pues esta ya ha sido lamada por la 3, Solucién 1: usar require_once(), que carga el dacumente solo si no ha sido insertado antes. Ast, en el escenario anterior, el archivo claset.php empezaria as:

También podría gustarte