¿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!
Polimorfismo en Programación Orientada a Objetos con PHP
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.
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:
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
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
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
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.
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.
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();
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.?>