Privaatse omaduste probleem pärimisel OOP-s PHP-s

Asjaolu, et privaatseid omadusi ei pärita, võib viia ootamatu probleemini. Vaatame näidet. Oletame, et meil on järgmine vanemaklass privaatse omadusega:

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

Oletame, et alamklassis otsustasime luua meetodi, mis suurendab vanust ühe võrra. Kuid proov muuta vanema privaatset omadust viib veani:

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

Viga kaob, kui alamklassis deklareerida privaatne omadus $age:

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

Siin ootabki meid lõks! Tegelikult loome kaks privaatset omadust: üks vanemas ja üks järglases. Ja need töötavad täiesti sõltumatult. See tähendab, et vanema meetodid muudavad oma omadust ja järglase meetodid - oma omadust.

Sellel probleemil on tegelikult lahendus. Lihtsalt on vaja manipuleerida vanema privaatseid omadusi läbi selle vanema meetodite. Kirjutame oma koodi ümber vastavalt sellele:

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

Saab lihtsustada:

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

Järgmises koodis alamklassis kirjutatakse üle vanema meetod. Parandage probleemid selles koodis:

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; // viga
      }
    }
  }
?>