Tatizo la Sifa za Kibinafsi Wakati wa Kurithi katika OOP katika PHP

Kukosa sifa za kibinafsi kurithiwa, kinaweza kusababisha tatizo lisilotarajiwa. Tuangalie kwa mfano. Tuchukulie tuna kitabu kizazi mzazi chenye sifa ya kibinafsi ifuatayo:

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

Tuchukulie katika kitabu kizazi mtoto tuliamua kutengeneza njia, ambayo itaongeza umri kwa moja. Hata hivyo, jaribio la /kubadilisha sifa ya kibinafsi ya mzazi litasababisha hitilafu:

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

Hitilafu itatoweka, ikiwa katika kitabu kizazi mtoto kitatangaza sifa ya kibinafsi $age:

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

Hapo ndipo tunakabiliwa na mtego! Kweli sisi tulizaa sifa mbili za kibinafsi: moja kwenye mzazi na moja kwenye mtoto. Na zinafanya kazi kikamilifu kwa kujitegemea. Hii inamaanisha, kwamba njia za mzazi zitabadilisha sifa zake, na njia za mtoto - zake.

Tatizo hili kweli lina ufumbuzi. Ni lazima tuwasilishe sifa za kibinafsi za mzazi kupitia njia za mzazi huyo. Tuandike tena msimbo wetu kulingana na hili:

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

Inaweza kurahisishwa:

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

Katika msimbo ufuatao kwenye kitabu kizazi mtoto njia ya mzazi inafafanuliwa upya. Sahihisha matatizo kwenye msimbo huu:

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