image
Inicio » PHP » Artículos sobre PHP » PHP orientado a objetos. Parte y III




PHP orientado a objetos. Parte y III

 
Por Carlos Gallús
Artículos publicados: 3
Valoración media: 3.75/5
Usuario desde: 01/08/2002

Qué es la Herencia en PHP y como implementarla

Como su nombre indica el concepto de herencia se aplica cuando creamos una clase, que va a heredar los métodos y atributos de una ya definida, entonces la clase que hemos creado es una subclase. Para que una clase sea subclase de otra ya creada deberemos usar la palabra reservada extends en el siguiente código podremos ver como creamos una clase llamada SubClaseA que heredará los métodos y atributos de una clase definida con anterioridad llamada ClaseA.

class SubClaseA extends ClaseA {
   var $atributo2;
   function operacion2() {
   }
}

Tenemos la clase ClaseA que es definida de la siguiente forma:

Class ClaseA {
   var $atributo1;
   function operacion1(){
   }
}

Si creamos un objeto de la clase SubClaseA este heredará todos los métodos de la clase ClaseA, por lo tanto el siguiente código es válido:

$x = new SubClaseA();
$x->operacion1();
$x->atributo1 = 100;
$x->operacion2();
$x->atributo2 = 200;

Como podemos observar aunque declaremos un objeto de la clase SubClaseA, al ser una clase extendida de ClaseA podemos hacer uso de todos los métodos y atributos definidos en ClaseA como si estuvieran contenidos en SubClaseA.

Debemos tener en cuenta que la herencia solo trabaja en una dirección, la subclase o clase hija hereda las características de su clase padre o superclase, pero la clase padre no posee las características de la hija. Para el caso anterior ClaseA no tendría atributo2 ni metodo2();

Como sobrescribir métodos y atributos

Como hemos visto anteriormente, una subclase declara atributos nuevos y operaciones sobre una superclase. Es posible y en muchos casos útil sobrescribir las mismas operaciones o atributos declarados en la superclase. Esto se hace para dar a un atributo un valor diferente en la subclase que el que tiene en la superclase o en el caso de las operaciones para cambiar la funcionalidad de estas. Veamos un ejemplo, por ejemplo si tenemos la clase A:

class A {
   var $atributo = 'valor inicial'
   function operación() {
      echo 'Clase A:<br>';
      echo 'El valor de \$atributo es $this->atributo<br>';
   }
}

Queremos crear una subclase B y alterar el valor de atributo y la funcionalidad de operación de la clase A, entonces escribimos:

Class B extends A {
   var  $atributo = 'valor cambiado';
   function operación() {
      echo 'Clase B:<br>';
      echo 'El valor de \$atributo ahora es $this->atributo<br>';
   }
}

Como podemos observar hemos definido una variable y una operación en B con el mismo nombre que tenían en A.

Como se ha comentado anteriormente aunque declaremos B no afecta a la definición de A, y si creamos un objeto de la superclase A esté mantendrá sus valores originales. Solo sobrescribiremos los valores y funcionalidad de A cuando creemos un objeto de la clase B.

A diferencia de otros lenguajes OO, PHP no nos permitirá sobrescribir una función o atributo y poder llamar a los valores de la clase padre.

La herencia puede tener muchas capas de profundidad, por ejemplo podemos tener una clase C que es subclase de B y está última ser subclase de A, la subclase C heredará y sobrescribirá aquellos atributos y métodos de sus clases padres, en este caso A y B.

¿Soporta PHP la herencia múltiple?

Algunos lenguajes OO soportan herencia múltiple, esto significa que una subclase puede heredar de varias clases padres. PHP no permite esto y una subclase solo puede heredar de una clase padre, sin embargo en PHP no hay ningún tipo de restricción en cuanto a el número de subclases que pueden heredar de una misma clase padre o superclase.

Qué es el polimorfismo y como implementarlo

Cualquier lenguaje de programación orientado a objetos debe soportar el polimorfismo, esto significa que clases diferentes tendrán un comportamiento distinto para la misma operación. Esto lo veremos más claro con el siguiente ejemplo.

Supongamos que tenemos dos clases distintas coche y ciclomotor. Ambas tienen sus propios métodos de movimiento, éstos tienen diferentes comportamientos, pero su nombre es el mismo

class coche {
   function avanza() {
   }   
   function para() {
   }
   function girar_derecha() {
   }
}

class ciclomotor {
   function avanza() {
   }   
   function para() {
   }
   function girar_derecha() {
   }
}

Como podemos observar, ambas clases tienen los mismos métodos, supongamos ahora que tenemos otra clase que controla el movimiento de todos los vehículos, es aquí donde entra en juego el polimorfismo, que dependiendo del objeto que tratemos actuará de una forma u otra el método al que llamamos.

class movimiento {
   function mover_adelante($obj) {
      $obj->avanza();
   }
}

Supongamos que queremos mover cualquier vehículo hacia adelante entonces haríamos:

$obj_coche = new coche();
$obj_ciclomotor = new ciclomotor();

$obj_movimiento = new movimiento();

// con esta sentencia el coche avanzaria hacia adelante.
$obj_movimiento->mover_adelante($obj_coche);

// con esta sentencia el ciclomotor avanzaría hacia adelante.
$obj_movimiento->mover_adelante($obj_ciclomotor);

Como podemos ver el mismo método del objeto movimiento actúa de dos formas diferentes dependiendo del objeto que le pasamos como parámetro.


Otros artículos recientes de este autor:
Fecha publicación: 22/12/2002


Más artículos

Valoración

Este artículo ha sido valorado 1073 veces. Valor:  [3.97/5]   
Malo------>Normal----->Bueno
                   

Comentarios

guillem 30/12/2002

He leído que lo en alguna parte que (nose si en PHP 4.3 o en un próximo futuro) és posible la múltiple herencia, puede alguien confirmar o no? o decirme si estoy en lo cierto donde puedo encontrar información sobre esto?

gracias

epplestun (epplestun@zonaphp.com)07/01/2003

Si, la multiple herencia esta implementada en el nuevo motor de Zend 2 y esto llegara con PHP5 a comienzos del verano junto con PHP-GTK2

Carlos Gallús Lahoz (cgallus@svalero.es)12/01/2003

Como muy bien dice nuestro amigo "epplestun" el nuevo motor de Zend 2 incluye estos cambios en su modelo de objetos, así como otros muchos que lo asimilan a lenguajes como JAVA, control de errores(try/catch/trhow)...
Podeis encontrar información sobre éstas mejoras en:
http://www.zend.org/zend/zend-engine-summary.php (breve introducción).
http://www.zend.org/engine2/ZendEngine-2.0.pdf (información más detallada).


Viktor (v_rosta@hotmail.com)03/06/2003

Hay un error grabe en el arttículo, PHP no soporta polimorfismo.
El polimorfismo en la progamación orientada a objetos no es que dos clases diferentes puedan tener un método(funciones) de igual nombre.
El polimorfismo es que puedan exitir dos métodos con el mismo nombre dentro de una misma clase, y que en tiempo de ejecución elija.

Ej:
class Polimorfismo {
function metodo ($integer,$string){
//Cogigo
}
function metodo ($string){
//Cogigo
}
}
Esto no lo soporta PHP al no ser un lenguaje tipado.

Randomyzer 09/07/2003

Viktor, eso que Ud. dice es sobrecarga de funciones

JHilario 30/07/2003

Viktor, El polimorfismo se refiere a lo que dice el articulo, es decir, dos clases tienen un metodo con el mismo nombre, lo único que falto decir es que deben heredarse de una clase base la cual implementa tambien el mismo método; de esta forma las clases que heredan pueden asignarse a objetos de la clase base. Lo que tu mencionas se llama sobrecarga de funciones, y en lenguajes como Java, C++ o Delphi se eimplementa variando e número o tipo de argumentos(sin posible 'promoción' de tipo).

Guille (ggWilly@hotmail.com)02/08/2003

Viktor, me parece q tenes un error conceptual el POLIMORFISMO no se da entre CLASES se da entre OBJETOS, aunque la definicion sea en la clase. Esta propiedad permite q un "MISMO MENSAJE o METODO o Funcion" pueda ser interpretado/a por N objetos de manera distinta sin importarnos como lo implemente cada uno. Ese es el proposito fundamental. Y no encuentro razones o casos para definir dos o mas Funciones con el mismo nombre dentro de una clase. Resumiendo ... PHP acepta POLIMORFISMO y q no acepte herencia MULTIPLE no es un inconveniente, ya q con la herencia SIMPLE alcanza y sobra, La herencia multiple estoy seguro q traería mas dolores de cabeza q soluciones ........ ESTO es solo mi modesta opinion espero q el tema de para seguir hablando ..... un saludo desde ARGENTINA !!!

daniel 23/03/2004

si existe motivo para definir el mismo metodo dos veces en la misma clase, y es, por ejemplo , hacer que un valor que no se le pase al constructor se defina por defecto dentro del constructor, . por ej:
class construir {
function construir($string,$int) {
echo $string ;
echo $int ;
}
function construir($string) {
$int = 222;
echo $string ;
echo $int ;
}
}

Añadir un comentario

Si no está de acuerdo con algo o quiere añadir más información al respecto puede incluirla añadiendo un comentario.

Nombre:
E-Mail: (opcional)
Los comentarios son moderados, no aparecen inmediatamente, son leídos por el administrador y publicados según el interés para otros lectores.

Se reserva el derecho de publicación de los comentarios introducidos.

Colabora

¿Te sientes capacitado para escribir un artículo como este? ¿Te gustaría colaborar escribiendo artículos en WebEstilo? Háznoslo saber !!









Comparte



 
Valid HTML 4.01!
Última modificación:31 de Agosto de 2017. Spain - Espa�a.
© 1998-2004 por . Todos los derechos reservados.