Clases abstractas en POO en PHP
Supongamos que tienes una clase User, y de
ella heredan las clases Employee y
Student.
Y se supone que vas a crear
objetos de las clases Employee y Student,
pero objetos de la clase User - no,
ya que esta clase solo se utiliza para
agrupar propiedades y métodos comunes de sus
descendientes.
En este caso puedes prohibir forzosamente
crear objetos de la clase User, para que
tú u otro programador en algún lugar no los creen accidentalmente.
Para esto existen las llamadas clases abstractas. Las clases abstractas representan clases destinadas a la herencia a partir de ellas. Al mismo tiempo, no se pueden crear objetos de tales clases.
Para declarar una clase como abstracta,
necesitas escribir la palabra clave
abstract en su declaración:
<?php
abstract class User
{
}
?>
Entonces, escribamos la implementación de la clase
abstracta User. Supongamos que tiene una propiedad
privada name, así como getters y setters
para ella:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
}
?>
El intento de crear un objeto de la clase User
causará un error:
<?php
$user = new User; // dará un error
?>
Pero heredar de nuestra clase sí será
posible. Hagamos la clase Employee, que
heredará de nuestra clase abstracta
User:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
}
?>
Creemos un objeto de la clase Employee -
todo funcionará:
<?php
$employee = new Employee;
$employee->setName('john'); // método del padre, es decir, de la clase User
$employee->setSalary(1000); // método propio, es decir, de la clase Employee
echo $employee->getName(); // mostrará 'john'
echo $employee->getSalary(); // mostrará 1000
?>
Crea una clase abstracta Figure,
que represente una figura geométrica.
Que de ella hereden clases
para el círculo, el rectángulo y el cuadrado.