Polimorfismo en Programación Orientada a Objetos con PHP
Resumen
¿Qué es el polimorfismo en la programación orientada a objetos?
El polimorfismo es un concepto de la programación orientada a objetos que a menudo se presenta con términos complejos en internet. Sin embargo, su esencia es sencilla: se refiere a la capacidad de un elemento para adoptar múltiples formas y comportamientos. Imagina que tienes una tabla de comentarios en una base de datos que puede utilizarse para comentar sobre productos, páginas, o cualquier otra cosa en tu sistema. Esa tabla es polimórfica porque puede adoptar diferentes roles y comportamientos a lo largo del sistema.
¿Cómo se aplica el polimorfismo en programación?
El polimorfismo se ejemplifica al crear clases y acciones que pueden comportarse de maneras distintas. Este concepto se aprecia al observar cómo un mismo método de una clase puede arrojar diferentes resultados según el contexto en el que se utiliza. Veamos un ejemplo práctico para entender cómo funciona en la codificación.
abstractclassBase{protected$name;// Propiedad protegida nameprivatefunctiongetClassName(){returnget_class($this);// Devuelve el nombre de la clase actual}publicfunctionlogin(){return"Mi nombre es $this->name desde la clase ".$this->getClassName();}}classAdminextendsBase{publicfunction__construct($name){$this->name=$name;}}classUserextendsBase{publicfunction__construct($name){$this->name=$name;}}classGuestextendsBase{publicfunction__construct(){$this->name="Invitado";}}// Creación de objetos e impresiones$guest=newGuest();echo$guest->login();// Imprime: Mi nombre es Invitado desde la clase Guest$user=newUser("Ítalo");echo$user->login();// Imprime: Mi nombre es Ítalo desde la clase User$admin=newAdmin("Linda");echo$admin->login();// Imprime: Mi nombre es Linda desde la clase Admin
¿Cómo se comportan diferentes objetos en el polimorfismo?
En el ejemplo anterior, se crea una clase base abstracta que contiene un método login común para todas las clases que heredan de ella. Cada clase derivada (Admin, User, Guest) implementa de manera distinta la asignación de su nombre, demostrando así el polimorfismo:
Guest: Tiene un nombre fijo "Invitado".
User: Asigna un nombre al instanciar la clase.
Admin: También asigna un nombre al instanciarse.
Este comportamiento demuestra cómo un método (login) puede producir diferentes salidas dependiendo del contexto y la instancia de la clase que lo llama. Es un ejemplo claro de polimorfismo, donde un mismo método gestiona de forma distinta a los objetos derivados de la clase base.
¿Qué técnicas de programación observamos en el ejemplo?
El código proporciona una buena práctica de encapsulamiento al utilizar la palabra clave private para el método getClassName y protected para la propiedad $name. La encapsulación permite que los detalles internos de las clases se mantengan ocultos del exterior, lo que mejora la seguridad y la estabilidad del código.
Además, el uso de un servidor local mediante PHP -S para ejecutar código demuestra cómo puedes implementar rápidamente un entorno de prueba sencillo y efectivo para verificar el funcionamiento de tu código.
¿Por qué es importante el polimorfismo en el desarrollo de software?
El polimorfismo beneficia el desarrollo de software al ofrecer flexibilidad y reusabilidad en la programación. Permite que un programa maneje diferentes tipos de datos y procesos de un modo uniforme, facilitando la extensión y mantenimiento del código sin necesidad de modificar la implementación existente. Este comportamiento promueve buenas prácticas de programación y facilita la colaboración en equipos de desarrollo al permitir la reutilización de componentes de software de manera efectiva y segura.
Recuerda que siempre hay espacio para aprender más sobre estos conceptos y su aplicación. ¡Continúa explorando y mejorando tus habilidades de programación!
Algunas veces es necesario reescribir el método en las clase hija, ya que el método heredado es muy complejo y necesita mucho más parámetros que el resto!
La palabra Polimorfismo puede que cause miedo al escucharla por primera vez, a mi me pasó, pero realmente no es nada del otro mundo, simplemente es darle a una clase diferentes comportamientos, prácticamente lo que hacemos al heredar la clase Base en la clase Admin o User es sobreescribir su constructor para que se comporte de una manera distinta, pero que el resto de la clase Base siga igual, prácticamente, si yo heredo una clase, puedo cambiar el comportamiento de sus métodos sobreescribiéndolos, y si alguien hereda mi clase, se comportará de la nueva forma en la que yo la definí, pero si alguien hereda la clase padre, se comportará de la forma que tiene por defecto, de esa forma no tenemos que cambiar el código base y podemos conseguir que una clase se comporte de maneras diferentes dependiendo de la situación.
Interesante aporte
Más sencillo no puede estar explicado
Polimorfismo
El polimorfismo solamente significa varias formas. Esto quiere decir que si un mismo elemento si se comporta de diferentes maneras y otorga diferentes resultados quiere decir que aplica el término de polimorfismo.
<?phpabstractclassBase{protected$name;privatefunctiongetClassName(){returnget_called_class();}publicfunctionlogin(){return"<p>Mi nombre es $this->name desde la clase {$this->getClassName()} <br><p>";}}classAdminextendsBase{publicfunction__construct($name){$this->name=$name;}}classUserextendsBase{publicfunction__construct($name){$this->name=$name;}}classGuestextendsBase{protected$name='invitado';}$guest=newGuest();echo$guest->login();$admin=newAdmin('Helena');echo$admin->login();$user=newUser('John Moore');echo$user->login();
Para abrir el servidor de php utilizamos el comando
php -S localhost:8000
Y también podemos ejecutar el archivo utilizando el comando:
php *archivo*.php
Esta muy bueno el hack de ejecutar un archivo usando PHP. Gracias.
Bikatti, muchas gracias, tus apuntes son geniales.
Recuerden:
Poli => Muchos
Morfismo => Formas
Es contruir metodos con el mismo nombre pro con diferentes comportamientos
Recomiendo mucho el curso de POO de ann
Para jugadores de League of legends, les traigo un ejemplo, para que entiendan mas facil, espero que les funcione.
<?php
classPersonaje{//Atributos - mi personaje tiene una vida y un dano de ataquepublic $vida;public $damage;//Metodos - al Atacar arrojara este mensaje por defecto.publicfunctionAtacar(){return'Acabas de atacar';}}//Estoy creando la clase garen, donde heredara todos, los atributos y metodos de la clase Personaje.classGarenextendsPersonaje{publicfunction__construct($vida,$damage){ $this->vida = $vida; $this->damage = $damage;}//Polimorfismo, estamos sobre escribiendo la funcion de atacar segun la necesidad que tiene este personaje.//Cuando garen ataca arroja un mensaje especial para el (Garen)publicfunctionAtacar(){return'Garen acaba de pegar y te quito: '.$this->damage;}}//Instancio mi objeto, le envio la vida y el dano que tendra.$garen =newGaren(100,20);echo $garen->Atacar();
¡Wow! Excelente ejemplo. Como viciado al lol lo entendí mejor y a la perfección jaja. Se agradece.
Para cualquier videojuego de combate se entiende perfecto
🔮 El polimorfismo nos permite otorgar diferentes comportamientos a un método, conservando el mismo identificador.
Estás en el top 3 de profesores de Platzi. Muy conciso en las explicaciones, con ejemplos clarísimos y súper pragmático. Gracias.
Este es mi aporte use namespace porque al parecer estaba confundiendo las clases de otras carpetas y con namespace especificas que esos archivos solo van a pertenecer dentro de ese grupo en este caso es Polimorfismo
Index.php
User.php
Admin.php
Guest.php
Base.php
Perdon me equivoque en una imagen este es
Base.php
php -S localhost:8000 es un buen dato para probar rapidamente los cambios en php
PARA MI no tiene sentido usar en el ejemplo una clase abstracta ya que en la practica no lo es. Es hasta un distractor. Pero si Italo lo hizo así alguna buena razón debe tener.
Sí, amigo. Si te das cuenta, es como cuando declaras una variable y la dejas vacía para después darle un comportamiento.
Para mí fue mucho más fácil que me lo explicaran en Java, tal vez a ti igual te sirva.
Los de código facilito me lo explicaron rebien
En realidad si tiene sentido, la declaró abstracta porque la clase Base es una clase que no se debe instanciar.
Las clases abstractas no se pueden instanciar directamente, solo se pueden instanciar las clases hijas (mientras no sean abstractas). Una clase abstracta no necesariamente tiene que tener métodos abstractos, depende del caso.
<?phpabstractclassClase1{publicfunctionmetodo1(){echo'Ejecución del Método 1';}}abstractclassClase2extendsClase1{publicfunctionmetodo2(){echo'Ejecución del Método 2';}}classClase3extendsClase2{publicfunctionmetodo3(){echo'Ejecución del Método 3';}}// $objeto1 = new Clase1(); // Esto genera un error// $objeto2 = new Clase2(); // Esto genera un error// Lo correcto es:$objeto3=newClase3();$objeto3->metodo1();// Ejecución del Método 1echo'<br>';$objeto3->metodo2();// Ejecución del Método 2echo'<br>';$objeto3->metodo3();// Ejecución del Método 3?>
Mi código que hicimos en la clase:
index.php
<?php
abstract classPolimorfismo{protected $name;privatefunctiongetClassName(){returnget_called_class();}publicfunctionlogin(){return"Mi nombre es $this->name desde la clase {$this->getClassName()}";}}classAdminextendsBase{publicfunction__contruct($name){ $this->name = $name;}}classUserextendsBase{publicfunction__contruct($name){ $this->name = $name;}}classGuessextendsBase{protected $name ='Invitado';}$guest =newGuest();echo $guest->login();//Mi nombre es Invitado de la clase guest.$user =newUser('Iridian');echo $user->login();//Mi nombre es Iridian de la clase user.$admin =newAdmin('Guadalupe');echo $admin->login();//Mi nombre es Guadalupe de la clase Admin.?>
Gracias
Es decir que el polimorfismo es la versatilidad y la amplitud de usos que tiene un fragmento de código ?
Polimorfismo:
Caracteristica que tiene un elemento, que se comporta de diferentes maneras y entrega diferentes resultados.
Entonces si, es cierto, un bloque de codigo versatil como el de comentarios puede funcionar como comentario de productos o de paginas.
Algo que aprendí en la clase es
php -S localhost:8000
Nos sirve para arrancar el servidor desde php, tu que aprendiste en esta clase?
Hola
Alguien me podría explicar porque no me arrojan los nombres???
Tengo el codigo exactamente igual
Saludos???
O sera que es porque no use su servidor virtual, ya que me fui directo al localhost de apache; aunque no creo que sea por esto
Saludos
El curso de POO con Anahi nos envian a ver este video, para poder hacer lo que hemos hecho con java, python y javascript, en php. Pero, honestamente, NO ENTENDI NADA, de lo que este profesor explico, es muy confuso llegar a un curso que va por mas de mitad.... AYUDA
En una de las clases pasadas habíamos creado otro archivo con el nombre de Base.php y al extender mis clases hijas de Base, me toma la clase creada en ese archivo y no en el que estoy, como pueden ver, me salta un error que dice que no estoy implementando el método store, que fue un método abstracto que habíamos creado en clases anteriores. ¿Cómo podría solucionar esto? Es decir que al extender me tome del archivo en el que estoy y no de otro.
Es más que nada para saber si es que existe otras formas que no sean cambiar los nombres de mi archivos, como el namespace, solamente que no sé como implementarlo.
¡Hola! Es porque no puedes tener dos clases que se llamen igual. No importa en qué archivo estés, si estas usando composer no puedes tener dos clases con el mismo nombre.
Te recomiendo usar namespaces, básicamente son como los "nombres con apellidos" de tus clases :D
Por ejemplo, no es lo mismo decir app\Clases\Auth\Base.php que decir app\Clases\Base.php. Aunque tienen el mismo nombre como archivo, no tienen el mismo namespace. Y básicamente los namespaces son la ruta en la cual tu archivo se encuentra :D
Excelente, muchas gracias.
Desde mi punto de vista con todo respeto, el profesor escribe muy rápido y si estamos en este modulo es porque somos aprendices y no dominamos el tema, por lo tanto considero que se requiere mayor explicación en cada paso del proceso.
Polimorfismo--representación gráfica
Si alguien utiliza Visual Studio Code pueden utilizar una extension que se llama PHP Server.
Después de instalar dan clic derecho en el área de trabajo y dan PHP server project. Adjunto una imagen para que sea mas detallada. Para que puedan ejecutar otro programa tienen que detener el servidor con Stop Server.