¿Qué es la herencia en programación orientada a objetos?
La herencia es un pilar fundamental de la programación orientada a objetos (POO). Este concepto permite que una clase hija o derivada herede métodos y propiedades de una clase madre o base. En términos más simples, si la clase madre tiene ciertos métodos y propiedades, la clase hija puede utilizarlos, beneficiándose de estas funcionalidades ya definidas. Así, la herencia promueve la reutilización del código y facilita una mejor organización y mantenimiento de los programas.
¿Cómo implementar la herencia en PHP?
Para ilustrar cómo funciona la herencia en PHP, se creará un ejemplo sencillo de herencia entre dos clases: User y Admin.
<?php// Definición de la clase base UserclassUser{public$name;// Constructor para inicializar la propiedad namepublicfunction__construct($name){$this->name=$name;}// Método para obtener el nombre del usuariopublicfunctiongetName(){return$this->name;}}// Definición de la clase derivada Admin que hereda de UserclassAdminextendsUser{// Aquí no es necesario definir propiedades o métodos adicionales}// Creación de un nuevo objeto Admin$admin=newAdmin("Profesor");// Llamada a un método heredado de la clase Userecho$admin->getName();// Salida: Profesor?>
En este ejemplo, la clase Admin extiende de User, lo que significa que Admin hereda todas las funcionalidades de User, lo que incluye el constructor y el método getName.
¿Qué es el polimorfismo y cómo se utiliza?
El polimorfismo es la capacidad de definir un método en una clase base y tener versiones específicas en clases derivadas. Esto permite que métodos con el mismo nombre en diferentes clases tengan comportamientos distintos. En el ejemplo anterior, podríamos personalizar el método getName en la clase Admin si es necesario.
classAdminextendsUser{// Sobrescribiendo el método getNamepublicfunctiongetName(){return"Soy ".parent::getName();}}$admin=newAdmin("Ítalo");echo$admin->getName();// Salida: Soy Ítalo
Esta sobrescritura cambia el comportamiento del método en la clase Admin, demostrando el poder del polimorfismo.
¿Cómo evitar la sobrescritura con final?
El uso de la palabra clave final es una estrategia para prevenir la sobrescritura de métodos o la herencia de clases. Cuando un método o una clase se define como final, ni puede ser sobrescrito en una clase derivada ni esa clase puede usarse como base para otra clase.
classUser{public$name;publicfunction__construct($name){$this->name=$name;}// Método marcado como finalfinalpublicfunctiongetName(){return$this->name;}}classAdminextendsUser{// Intento de sobrescribir un método final provoca un errorpublicfunctiongetName(){return"Soy ".parent::getName();}}
Con final, como se muestra arriba, PHP lanzará un error si se intenta sobrescribir getName en Admin.
¿Cuándo se debe usar una clase final?
Las clases definidas como final no pueden extenderse. Esto es útil cuando se desea asegurarse de que ninguna funcionalidad de la clase en cuestión sea modificada a través de la herencia. Se aplica cuando:
La clase en cuestión cumple su propósito específico en el diseño general del programa.
Se busca prevenir la manipulación o modificación de la lógica interna de la clase por medio de la herencia.
finalclassUtility{publicstaticfunctionprocess(){return"Procesando...";}}// Intento de extender una clase final provoca un errorclassExtendedUtilityextendsUtility{// Error: Cannot extend final class Utility}
En este ejemplo, Utility no puede ser extendida, asegurando que su funcionalidad permanece inalterada.
Aprender sobre herencia, polimorfismo y la palabra clave final en POO no solo enriquece tu comprensión teórica, sino que también te capacita para implementar estructuras más robustas y mantenibles en tus desarrollos en PHP. ¡Sigue explorando y aplicando estos conceptos!
¡Al fin Herencia! Este concepto es super sencillo, prácticamente es que, si heredas una clase, vas a tener acceso a sus métodos y propiedades desde otra clase, siempre y cuando, sean public o protected (Recuerda, private no)
Este concepto une a los demás conceptos, si te quedó alguna duda de algún concepto anterior, te recomiendo volver a mirar ese capítulo, pero ahora teniendo en cuenta este concepto.
Algo que es nuevo para mi es lo de "final" lo desconocía, pero igual es sencillo, prácticamente se puede usar para evitar el polimorfismo o la herencia en caso de que sea una clase.
Interesante aporte
Fue excelente tu explicación hermano, pero de hecho el objetivo de la palabra reservada "final", es que el valor de dicho método o variable nunca cambie, por ejemplo, si tú colocas esa palabra en una variable y le colocas el valor 0, no podrás redefinir esa variable con un valor distinto. lo mismo con los métodos.
Herencia
La herencia nos permitirá crear nuevas clases a partir de otras. O sea, vamos reutilizar código. Quiere decir, que vamos a hacer una abstracción para generar una súper clases general que después utilicemos para crear otras clases.
En la herencia también tendremos una jerarquía de padre e hijo.
En OOP, la clase padre siempre la encontraremos como la 'Súperclase' y los hijos como 'subclase'.
Y a través de encapsulamiento vamos a poder definir que puede heredar el hijo y que no.
El método constructor nos permite inicializar las variables del objeto.
Y para crear una herencia utilizamos la palabra reservada extends seguido del nombre de la clases.
<?phpclassAdminextendsUser{// ...}
Para evitar que se incumpla los principios SOLID 2 y 3, podemos utilizar la palabra reservada final al principio del método. También, podemos utilizar este la palabra reservado final en una clase, pero esto significa que no puede ser heredada.
¿Qué son "los principios SOLID 2 y 3"? lo busque pero no me sale nada
Herencia
La versión de php 8 nos trae una manera mas amigable de poder crear clases.
Encuentra mas aquí en la documentación oficial
Buen aporte companero
Una duda, ¿Se podría extender de una clase final si en la hija solo generas funciones que no existan en la clase padre?
Hola, no, al poner la palabra "final" en tu clase estás diciéndole a PHP que esa clase no puede ser extendida por ningún motivo, es prácticamente bloquear toda herencia a esa clase para que la clase no pueda ser modificada de ninguna manera.
Te invito a que hagas la prueba con código, te lanzará el error "Fatal error: Class Class1 may not inherit from final class (Class2) in /path/to/file.php" on line x
les comparto mi código que vimos en la clase:
<?php
classUser{public $name;publicfunction__construct($name){ $this->name = $name;}publicfunctiongetName(){return $this->name;}}classAdminextendsUser{publicfunctiongetName(){return"Soy $this->name";}}$admin =newAdmin('Italo');echo $admin->getName();//EJEMPLO CON FINAL.// <?php// final class User// {// public $name;// public function __construct($name)// {// $this->name = $name;// }// public function getName()// {// return $this->name;// }// }// class Admin// {// }// $admin = new User('Italo');// echo $admin->getName();
👍
Herencia
Nos permite heredar los métodos de la clase padre o madre a las subclases hijas.
Con la palabra final no podemos sobreescribir los métodos de la clase padre o madre.
Cuando declaramos una clase con la palabra final nos indica que esa clase no se puede heredar, por lo que se presentara un error al momento de ejecutar el código. De esta forma se evitaría la herencia de la clase.
La clase abstracta no se puede instanciar, pero una final si se puede instanciar.
En conclusión una herencia es utilizar todo lo que la clase padre tiene definido, si esta clase padre tiene 5 métodos, estos los tendran las clases que se hereden a partir de allí.
<?php
# final
classUser{public $name;publicfunction__construct($name){ $this->name = $name;} final publicfunctiongetName(){return"Soy $this->name";}}classAdminextendsUser{publicfunctiongetName2(){return"Soy $this->name";}} $admin =newUser('Jhon'); echo $admin->getName();?>
podria entonces decir:
.
Mi padre me encapsulo el auto de manera privada 🤣
.
<?php
classPadre{private $auto;}classYoextendsPadre{publicfunctionhacer_diligencia(){return"toca usar el bus";}}$yo =newYo();echo $yo->auto;echo $yo->hacer_diligencia();
resultado:
Warning:Undefined property:Yo::$auto inF:\laragon\www\2022-Platzi\...toca usar el bus
Jaajajajajaj me gustó
Jaajajaja ! 😮
✨ La herencia hace posible reutilizar código, gracias a la característica de crear nuevas clases a partir de otras.
Detallitos como los de la keyword final son los que hacen los cursos de Italo tan buenos.
¿Qué pasaría si las dos clases (User y Admin) tuvieran ambas un constructor con un ¿Cómo se les pasa los parámentros? ¿Se pasa el del padre o el del hijo?
¿con un qué?
En PHP, cuando una clase hereda de otra clase (como en el caso de Admin que hereda de User), la clase hija (es decir, Admin) puede tener su propio constructor. Sin embargo, si el constructor está presente en ambas clases (tanto en la clase padre como en la clase hija), es necesario tener en cuenta cómo se gestionan los parámetros y la ejecución del constructor en cada caso.
Cuando se crea una instancia de la clase hija (Admin), PHP primero llama automáticamente al constructor de la clase padre (User) antes de ejecutar el constructor de la clase hija (Admin). Esto es conocido como "construcción hacia arriba" o "construcción ascendente" (upward construction). Esto asegura que los datos y las configuraciones del padre se inicialicen antes de que la clase hija realice sus propias operaciones de inicialización.
Aquí hay un ejemplo para ilustrar cómo funciona esto:
classUser{protected$username;publicfunction__construct($username){$this->username=$username;}publicfunctiongetUsername(){return$this->username;}}classAdminextendsUser{protected$isAdmin;publicfunction__construct($username,$isAdmin){parent::__construct($username);// Llamada al constructor de la clase padre$this->isAdmin=$isAdmin;}publicfunctionisAdmin(){return$this->isAdmin;}}// Crear una instancia de Admin$admin=newAdmin('admin_user',true);// Acceder a métodos de ambas clasesecho$admin->getUsername();// Salida: admin_userecho$admin->isAdmin();// Salida: 1 (true)
En el ejemplo anterior, cuando se crea un objeto de la clase Admin, primero se llama al constructor de la clase User usando parent::__construct($username). Luego, el constructor de Admin se ejecuta, y se encarga de la inicialización adicional específica de la clase Admin.
En resumen, cuando una clase hija tiene su propio constructor, es recomendable llamar explícitamente al constructor de la clase padre utilizando parent::__construct() para asegurar que los datos de la clase padre se inicialicen adecuadamente antes de realizar cualquier operación adicional en la clase hija.
🍃 La herencia es un concepto importante de la programación orientada a objetos que permite a las clases hijas (subclases) heredar propiedades y comportamientos de sus clases padres (superclases). La subclase puede extender o modificar las características de la superclase y también puede agregar nuevas propiedades y métodos.
Un ejemplo de herencia en PHP podría ser el siguiente:
classAnimal{protected$name;protected$color;publicfunction__construct($name,$color){$this->name=$name;$this->color=$color;}publicfunctioneat(){return"El animal está comiendo";}publicfunctionsleep(){return"El animal está durmiendo";}}classDogextendsAnimal{publicfunctionbark(){return"El perro está ladrando";}}$myDog=newDog("Fido","Marrón");echo$myDog->eat();// El animal está comiendoecho$myDog->bark();// El perro está ladrando
En este ejemplo, la clase Animal es la superclase y la clase Dog es la subclase. La clase Dog hereda las propiedades y métodos de la clase Animal, lo que significa que puede usar los métodos eat() y sleep(), así como las propiedades name y color. Además, la subclase Dog también tiene un nuevo método llamado bark().
Cuando creamos un nuevo objeto de la clase Dog, podemos acceder a los métodos de la superclase Animal y a los métodos de la subclase Dog. En el ejemplo, creamos un nuevo objeto Dog llamado $myDog y llamamos a los métodos eat() y bark(). Como resultado, obtenemos "El animal está comiendo" y "El perro está ladrando".
En resumen, la herencia es un concepto clave en la programación orientada a objetos que permite a las clases hijas heredar propiedades y métodos de las clases padres, y agregar nuevas propiedades y métodos específicos.
Extender : Es básicamente heredar, utilizar eso que mi padre provee y yo como hijo pudiera sobrescribir si mi padre lo permite .
Herencia, esto es bastante sencillo.
Básicamente dice que tenemos una clase madre y de repente tenemos una clase hija.... Si la clase madre tiene 5 métodos, la clase hija puede utilizar esos métodos.
En otras palabras, si la clase madre tiene 5 métodos y la clase hija tiene 4 métodos al momento de heredar tenemos entonces que la clase hija va a contar con 9 método, sus propios métodos y los métodos propios de la madre; digamos que es una herencia directa bastante sencilla que podemos entender incluso comparándolo con la vida real.
La herencia es utilizar todo lo que mi padre tenga definido.
Existen palabras clases como: extender, final que cada una tiene su objetivo.
Resumen:
Puedes extender de una clase, o implementar una interfaz.
Si extiendes puedes usar los métodos que te interese de la clase madre, si implementas es obligatorio usar todos los metodos de la interfaz.
La herencia en programación orientada a objetos (POO) permite que una clase hija herede propiedades y métodos de una clase madre. Esto facilita la reutilización de código y la creación de jerarquías de clases. Por ejemplo, si tienes una clase "Usuario" y una clase "Administrador" que extiende "Usuario", el "Administrador" puede usar todos los métodos de "Usuario", además de sus propios métodos. La herencia promueve la modularidad y organización en el código, haciendo que sea más fácil de mantener y expandir.
Una duda, implements es lo mismo que heredar?
En PHP, implements y extends son dos conceptos clave en la programación orientada a objetos (POO) que se utilizan para establecer relaciones entre clases. Aquí te explico la diferencia entre ellos:
extends: Se utiliza para crear una clase hija que hereda propiedades y métodos de una clase padre. La clase hija puede extender (añadir) nuevos métodos y propiedades, y también puede sobrescribir (modificar) los métodos y propiedades de la clase padre. Por ejemplo:
En este ejemplo, la clase Perro extiende la clase Animal, por lo que hereda su método hacerSonido(). Sin embargo, la clase Perro sobrescribe ese método para proporcionar su propia implementación.
implements: Se utiliza para hacer que una clase implemente una o varias interfaces. Una interfaz es como un contrato que especifica qué métodos una clase debe implementar. Las clases que implementan una interfaz deben definir todos los métodos declarados en la interfaz. Por ejemplo:
En este ejemplo, la clase Perro implementa la interfaz Animal, lo que significa que debe definir el método hacerSonido() tal como se especifica en la interfaz.
Para resumir:
extends se utiliza para establecer una relación de herencia entre clases.
implements se utiliza para hacer que una clase cumpla con una interfaz, lo que garantiza que la clase implemente ciertos métodos definidos en la interfaz.
<?php
class user{
public $name;
public function __construct($name){
$this->name = $name;
echo '</br>'."estamos dentro de la calse: ".$name;
}
public function get_name(){
echo "</br>";
return $this->name;
}
}
class Admin extends User{
//...
}
$admin = new Admin('Perilla');
echo $admin->get_name();
?>