PHP OOP - Herencia
PHP - ¿Qué es la herencia?
Herencia en POO = Cuando una clase deriva de otra clase.
La clase secundaria heredará todas las propiedades y métodos públicos y protegidos de la clase principal. Además, puede tener sus propias propiedades y métodos.
Una clase heredada se define utilizando la extends
palabra clave.
Veamos un ejemplo:
Ejemplo
<?php
class Fruit {
public
$name;
public $color;
public
function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
public function intro() {
echo "The fruit is {$this->name}
and the color is {$this->color}.";
}
}
// Strawberry is inherited from Fruit
class
Strawberry extends Fruit {
public
function message() {
echo "Am I a fruit or a
berry? ";
}
}
$strawberry = new Strawberry("Strawberry", "red");
$strawberry->message();
$strawberry->intro();
?>
Ejemplo explicado
La clase Fresa se hereda de la clase Fruta.
Esto significa que la clase Strawberry puede usar las propiedades públicas $name y $color, así como los métodos públicos __construct() e intro() de la clase Fruit debido a la herencia.
La clase Strawberry también tiene su propio método: mensaje().
PHP - Herencia y modificador de acceso protegido
En el capítulo anterior aprendimos que protected
se puede acceder a las propiedades o métodos dentro de la clase y por clases derivadas de esa clase. ¿Qué significa eso?
Veamos un ejemplo:
Ejemplo
<?php
class Fruit {
public
$name;
public $color;
public
function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
protected function intro() {
echo "The fruit is {$this->name}
and the color is {$this->color}.";
}
}
class
Strawberry extends Fruit {
public
function message() {
echo "Am I a fruit or a
berry? ";
}
}
// Try to call all three methods from outside class
$strawberry = new Strawberry("Strawberry", "red");
// OK. __construct() is public
$strawberry->message(); // OK. message()
is public
$strawberry->intro(); // ERROR. intro()
is protected
?>
En el ejemplo anterior vemos que si intentamos llamar a un protected
método (intro()) desde fuera de la clase, recibiremos un error. public
¡Los métodos funcionarán bien!
Veamos otro ejemplo:
Ejemplo
<?php
class Fruit {
public $name;
public
$color;
public function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
protected function intro() {
echo "The
fruit is {$this->name} and the color is {$this->color}.";
}
}
class Strawberry extends Fruit {
public function message() {
echo "Am I a fruit or a berry? ";
// Call protected
method from within derived class - OK
$this ->
intro();
}
}
$strawberry = new Strawberry("Strawberry", "red"); // OK. __construct() is
public
$strawberry->message(); // OK. message() is
public and it calls intro() (which is protected) from within the
derived class
?>
¡En el ejemplo anterior vemos que todo funciona bien! Es porque llamamos al
protected
método (intro()) desde dentro de la clase derivada.
PHP - Anulación de métodos heredados
Los métodos heredados se pueden anular redefiniendo los métodos (use el mismo nombre) en la clase secundaria.
Mira el ejemplo de abajo. Los métodos __construct() e intro() en la clase secundaria (Strawberry) anularán los métodos __construct() e intro() en la clase principal (Fruit):
Ejemplo
<?php
class Fruit {
public
$name;
public $color;
public
function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
public function intro() {
echo "The fruit is {$this->name}
and the color is {$this->color}.";
}
}
class
Strawberry extends Fruit {
public $weight;
public
function __construct($name, $color, $weight) {
$this->name = $name;
$this->color = $color;
$this->weight = $weight;
}
public function intro() {
echo "The fruit is {$this->name}, the color is {$this->color},
and the weight is {$this->weight} gram.";
}
}
$strawberry = new Strawberry("Strawberry", "red",
50);
$strawberry->intro();
?>
PHP - La palabra clave final
La final
palabra clave se puede usar para evitar la herencia de clases o para evitar la anulación de métodos.
El siguiente ejemplo muestra cómo evitar la herencia de clases:
Ejemplo
<?php
final class Fruit {
// some code
}
//
will result in error
class
Strawberry extends Fruit {
// some code
}
?>
El siguiente ejemplo muestra cómo evitar la anulación de métodos:
Ejemplo
<?php
class Fruit {
final public function intro() {
// some code
}
}
class
Strawberry extends Fruit {
//
will result in error
public function intro() {
// some code
}
}
?>