Problema de las propiedades privadas en la herencia de POO en PHP

El hecho de que las propiedades privadas no se hereden puede llevar a un problema inesperado. Veamos un ejemplo. Supongamos que tenemos la siguiente clase padre con una propiedad privada:

php<?php
  class User {
    private $age;
    
    public function setAge($age) {
      $this->age = $age;
    }
    public function getAge() {
      return $this->age;
    }
  }
?>

Supongamos que en la clase hija decidimos crear un método que incrementará la edad en uno. Sin embargo, el intento de cambiar la propiedad privada del padre conducirá a un error:

php<?php
  class Student extends User {
    public function incAge() {
      $this->age++; // error
    }
  }
?>

El error desaparecerá si en la clase hija declaramos la propiedad privada $age:

php<?php
  class Student extends User {
    private $age;
    
    public function incAge() {
      $this->age++;
    }
  }
?>

¡Aquí es donde nos espera la trampa! En realidad, hemos creado dos propiedades privadas: una en el padre y una en el hijo. Y funcionan completamente de forma independiente. Esto significa que los métodos del padre modificarán su propiedad, y los métodos del hijo - la suya.

Este problema en realidad tiene solución. Simplemente hay que manipular las propiedades privadas del padre a través de los métodos de ese padre. Reescribamos nuestro código de acuerdo con esto:

php<?php
  class Student extends User {
    public function incAge() {
      $age = $this->getAge();
      $age++;
      $this->setAge($age);
    }
  }
?>

Se puede simplificar:

php<?php
  class Student extends User {
    public function incAge() {
      $this->setAge($this->getAge() + 1);
    }
  }
?>
Задание 1

En el siguiente código, en la clase hija se redefine un método del padre. Corrija los problemas en este código:

php<?php
  class User {
    private $name;
    
    public function setName($name) {
      $this->name = $name;
    }
    public function getName() {
      return $this->name;
    }
  }
  
  class Employee extends User {
    public function setName($name) {
      if (strlen($name) > 0) {
        $this->name = $name; // error
      }
    }
  }
?>