No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Herencia

12/19
Recursos

Aportes 31

Preguntas 3

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

隆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 鈥渇inal鈥 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.

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 鈥楽煤perclase鈥 y los hijos como 鈥榮ubclase鈥.

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.

<?php

class User {
    public $name;

    public function __construct($name) {
        $this->name = $name;
    }
}

Y para crear una herencia utilizamos la palabra reservada extends seguido del nombre de la clases.

<?php

class Admin extends User {
    // ...
}

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.

<?php

class User {
    public $name;

    final public function __construct($name) {
        $this->name = $name;
    }
}

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

les comparto mi c贸digo que vimos en la clase:

<?php


 class User
{
    public $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }
}

class Admin extends User
{
    public function getName()
    {
        return "Soy $this->name";
    }
}


$admin = new Admin('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
    class User
    {
        public $name;

        public function __construct($name)
        {
            $this->name = $name;
        }

        final public function getName()
        {
            return "Soy $this->name";
        }
    }


    class Admin extends User
    {
    public function getName2()
        {
            return "Soy $this->name";
        }
    }

    $admin = new User('Jhon');
    echo $admin->getName();
?>

鉁 La herencia hace posible reutilizar c贸digo, gracias a la caracter铆stica de crear nuevas clases a partir de otras.

podria entonces decir:
.
Mi padre me encapsulo el auto de manera privada 馃ぃ
.

<?php

class Padre
{
    private $auto;
}

class Yo extends Padre
{
    public function hacer_diligencia()
    {
        return "toca usar el bus";
    }
}

$yo = new Yo();
echo $yo->auto;
echo $yo->hacer_diligencia();

resultado:

Warning: Undefined property: Yo::$auto in F:\laragon\www\2022-Platzi\...
toca usar el bus

Detallitos como los de la keyword final son los que hacen los cursos de Italo tan buenos.

馃崈 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:


class Animal {
    protected $name;
    protected $color;

    public function __construct($name, $color) {
        $this->name = $name;
        $this->color = $color;
    }

    public function eat() {
        return "El animal est谩 comiendo";
    }

    public function sleep() {
        return "El animal est谩 durmiendo";
    }
}

class Dog extends Animal {
    public function bark() {
        return "El perro est谩 ladrando";
    }
}

$myDog = new Dog("Fido", "Marr贸n");
echo $myDog->eat(); // El animal est谩 comiendo
echo $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 鈥淓l animal est谩 comiendo鈥 y 鈥淓l 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.

```html name = $name; echo '
'."estamos dentro de la calse: ".$name; } public function get_name(){ echo "
"; return $this->name; } } class Admin extends User{ //... } $admin = new Admin('Perilla'); echo $admin->get_name(); ?> ```
un poco de c贸digo```js name = $name; echo '
'."estamos dentro de la calse: ".$name; } public function get_name(){ echo "
"; return $this->name; } } class Admin extends User{ //... } $admin = new Admin('Perilla'); echo $admin->get_name(); ?> ```

Herencia made easy

Se describe como la abilidad de una clase padre, transmitirle a sus hijos todos sus metodos y propiedades.
Siempre y cuando estos metodos sean de tipo:

  • Public
  • Protected

鈫 Como hemos venido trabajando se logra al extender desde una clase generica a unas clases con uso mas especifico.

Cuando y para que usamos la palabra reservada final?

Tecnica de memorizacion:

鈫 Dame las llaves abuelo, me voy con tu carro.
鈫 El abuelo: Si pero no le puedes cambiar nada al carro 馃

B谩sicamente, cuando se hereda se va a tener todas la propiedades y m茅todos del padre siempre y cuando estos no sean private

un concepto hermoso que es la herencia

Lo que aprend铆 en esta clase.

Cuando colocamos el

final

, evitamos que ser heredada.

Resumen

<?php

class User{
    public $name;
    public function __construct($name){
        $this->name = $name;
    }

    public function getName(){
        return $this->name;
    }
}

class Admin extends User{
    public function getName(){
        return 'Admin: '.parent::getName();
    }
}

$admin = new Admin('John');
echo $admin->getName();

Creo que este tema hubiera sido importante haberlo trabajado desde un principio ya que lo usamos en muchos ejercicios y si bien para alguien que ya hab铆a visto antes algo de POO le resulto familiar y no hubo necesidad de una previa explicaci贸n, para los que si venian de 0 en estos temas pudo ser algo confuso llegar hasta este punto.
Lo bueno que ya si uno investigo por su cuenta o se apoyo de los comentarios y llega hasta esta parte, todo queda m谩s claro 馃槂
Comparto mi apunte de la clase.
.
User

<?php

// Creando la clase padre
class User{
  
  // Creando m茅todo constructor (Versiones anteriores)
  
  // public $name;
  // public function __construct($name){
  //   $this->name = $name;
  // }

  // Otra forma de crear un m茅todo constructor en (Versiones PHP8 en adelante):
  public function __construct(public $name){}

  // Creando m茅todo para imprimir 'name'
  public function getName(){
    return $this->name;
  }

  /*
    Una clase, propiedad, constante o m茅todo pueden tener un encapsulamiento del tipo 'final'
    Esto lo que hace es que dicho elemento no pueda ser modificado o sobreescrito en alguna clase que herede de esta...
  */
  final public function getName2(){
    return $this->name;
  }

}

?>

.
Admin

<?php

// Incluyendo archivo 'User'
include_once('User.php');

// Creando clase que hereda de la clase 'user'
class Admin extends User{

  // Como esta clase hereda de la clase 'User' puede acceder a sus propiedades, constantes y m茅todos siempre y cuando el alcance lo permita
  // Adicionalmente se puede sobrecargar alg煤n m茅todo, es decir, se puede crear un m茅todo que exista en el padre para que tenga otro comportamiento siempre y cuando su m茅todo de acceso no sea 'final'
  
  public function getName(){ // Aplicando polimorfismo
    return "El nombre es: {$this->name}";
  }

  public function getName2(){ // Esto no es posible ya que el m茅todo 'getName2' tiene un encapsulamiento del tipo 'final' en la clase padre
    return "Esta clase fue modificada en la clase 'Admin'";
  }

}

// Creando una instanc铆a de la clase 'Admin'
$admin1 = new Admin("Joel");
echo $admin1->getName(); // El nombre es: Joel

// Si no se hubiera aplicado 'Polimorfismo' al m茅todo getName desde la clase 'Admin', el resultado seria:
// echo $admin1->getName(); // Joel

echo $admin1->getName2(); // Fatal error: Cannot override final method User::getName2()


?>

https://www.php.net/manual/es/language.oop5.inheritance.php
La herencia es un principio de programaci贸n bien establecido y PHP hace uso de 茅l en su modelado de objetos. Este principio afectar谩 la manera en que muchas clases y objetos se relacionan unas con otras.

Por ejemplo, cuando se extiende una clase, la subclase hereda todos los m茅todos p煤blicos y protegidos de la clase padre. A menos que una clase sobrescriba esos m茅todos, mantendr谩n su funcionalidad original.

La herencia permite heredar m茅todos y atributos de una clase en espec铆fico. Esto significa que podemos usarlos aunque no est茅n declarados en la clase hija.
La herencia se puede permitir con la palabra reservada extends
La herencia se puede **evitar ** con la palabra reservada final
La Herencia se relaciona con el Polimorfismo en que es el medio por el cu谩l podemos utilizar una misma funcionalidad para diversos comportamientos y caracter铆sticas

12. Herencia

Usamos extends para heredar en una clase, y anteponemos final si queremos que no se modifique un m茅todo o variable.

Si anteponemos final al nombre de una clase, esta no podr谩 ser heredada mediante extends.

<?php

class User
{
    public $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

/**
 * Al agregar "final" antes del nombre de la clase,
 * hago que el m茅todo no pueda ser redefinido
 * Tambi茅n se le puede colocar a variables o clases
 * Pero si se le coloca a una clase, esta
 * NO podr谩 ser heredada
*/

    final public function getName()
    {
        return $this->name;
    }
}

class Admin extends User
{
    // code
}

$admin = new Admin('Aldo');
echo $admin->getName();

Intentando agregar variables a Admin sin agreg谩rselas a User me encontr茅 con un problema ya que cuando utilizaba el constructor, este sobreescrib铆a la variable que tra铆a de la clase User. Al buscar acerca de c贸mo se hac铆a eso, encontr茅 lo siguiente:

class Admin extends User
{
    public function __construct($name, $access_number)
    {
        parent::__construct($name); //constructor heredado de User
        $this->access_number = (int) $access_number;
        
    }
    public function getAccessNumber()
    {
        return "Mi n煤mero de acceso es: $this->access_number ";
    }
}

Esto permite agregar variables sin perder las heredadas, no se si esto es una pr谩ctica recomendable o se realice de otra manera.

Las clases abstract no se pueden instanciar(贸sea crear un objeto con la palabra new), pero las clases final si.

La herencia es utilizar los m茅todos y propiedades del padre, y como hijo podemos sobrescribirlo si el padre lo permite, en este caso seria, si los m茅todos no indican el modificador de acceso final.

Excelente explicaci贸n, me queda claro el significado de herencia sin problema.
Gracias profesor

Excelente

  • La diferencia de una clase final y una clase abstracta es que la final si se puede instanciar, la abstarcta no. * 馃槂