Herencia de clase e implementación de interfaz en POO en PHP
Una clase puede heredar de otra clase y al mismo tiempo implementar alguna interfaz. Consideremos un ejemplo práctico.
Supongamos que queremos crear una clase Programmer,
que tendrá un nombre, un salario y una lista de lenguajes,
que conoce el programador.
Por ahora, nuestra descripción de la clase es bastante vaga:
sí, la clase tendrá nombre, salario, lenguajes -
pero, ¿qué métodos tendrá nuestra clase?
Describamos nuestra clase con mayor precisión utilizando
la interfaz iProgrammer:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Supongamos que revisamos las clases que ya hemos
implementado y, resulta, que ya tenemos una clase similar
Employee. No implementa todos los
métodos de la clase Programmer, pero sí una parte.
Aquí está el código de nuestra clase ya existente:
<?php
class Employee
{
private $name;
private $salary;
public function __construct($name, $salary)
{
$this->name = $name;
$this->salary = $salary;
}
public function getName()
{
return $this->name;
}
public function getSalary()
{
return $this->salary;
}
}
?>
Es lógico en nuestro caso hacer que
nuestra nueva clase Programmer herede
parte de los métodos necesarios de la clase
Employee (y la parte restante la implementaremos
luego en la nueva clase misma):
<?php
class Programmer extends Employee
{
}
?>
Al mismo tiempo, sabemos que la clase Pogrammer
debe implementar la interfaz
iProgrammer:
<?php
class Programmer implements iProgrammer
{
}
?>
Combinemos la herencia de la clase
Employee y la implementación de la interfaz
iProgrammer:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
El resultado será que nuestra clase Pogrammer
heredará de la clase Employee los métodos
__construct, getName y getSalary,
y los métodos addLang y getLangs
tendremos que implementarlos nosotros:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// implementación
}
public function getLangs()
{
// implementación
}
}
?>
A la interfaz iProgrammer no le importa,
si los métodos son nativos de la clase o heredados
- lo principal es que todos los métodos descritos estén
implementados.
Copie el código de mi clase Employee
y el código de la interfaz iProgrammer. No copie
mi plantilla de la clase Programmer -
sin mirar mi código, implemente esta
clase usted mismo.