Problem prywatnych właściwości przy dziedziczeniu w OOP w PHP

To, że prywatne właściwości nie są dziedziczone, może prowadzić do nieoczekiwanego problemu. Spójrzmy na przykład. Załóżmy, że mamy następującą klasę nadrzędną z prywatną właściwością:

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

Załóżmy, że w klasie potomnej postanowiliśmy stworzyć metodę, która będzie zwiększać wiek o jeden. Jednak próba zmiany prywatnej właściwości rodzica doprowadzi do błędu:

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

Błąd zniknie, jeśli w klasie potomnej zadeklarujemy prywatną właściwość $age:

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

Tutaj właśnie czai się na nas pułapka! W rzeczywistości stworzyliśmy dwie prywatne właściwości: jedną w rodzicu i jedną w potomku. I one działają całkowicie niezależnie. To oznacza, że metody rodzica będą zmieniać swoją właściwość, a metody potomka - swoją.

Ten problem w rzeczywistości ma rozwiązanie. Po prostu trzeba manipulować prywatnymi właściwościami rodzica poprzez metody tego rodzica. Przepiszmy nasz kod zgodnie z tym:

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

Można uprościć:

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

W następującym kodzie w klasie potomnej przesłaniana jest metoda rodzica. Popraw problemy w tym kodzie:

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; // błąd
      }
    }
  }
?>