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:

User.php<?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:

User.php<?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:

index.php<?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:

Employee.php<?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á:

index.php<?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
?>
Задание 1

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.