Privāto īpašību problēma mantojumā OOP PHP

Tas, ka privātās īpašības nemantojas, var izraisīt negaidītu problēmu. Apskatīsim to ar piemēru. Pieņemsim, ka mums ir šāda vecāku klase ar privātu īpašību:

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

Pieņemsim, ka bērna klasē mēs nolēmām izveidot metodi, kas palielinās vecumu par vienu. Tomēr mēģinājums mainīt vecāka privāto īpašību izraisīs kļūdu:

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

Kļūda pazudīs, ja bērna klasē deklarēsiet privāto īpašību $age:

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

Šeit mūs sagaida lamatas! Patiesībā mēs esam radījuši divas privātas īpašības: vienu vecākā klasē un vienu bērna klasē. Un tās darbojas pilnīgi neatkarīgi. Tas nozīmē, ka vecāka metodes mainīs savu īpašību, un bērna metodes - savas.

Šai problēmai patiesībā ir risinājums. Vienkārši ir jāpārvalda vecāka privātās īpašības caur šī vecāka metodēm. Pārrakstīsim mūsu kodu saskaņā ar to:

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

Var vienkāršot:

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

Nākamajā kodā bērna klasē tiek pārdefinēta vecāka metode. Izlabojiet problēmas šajā kodā:

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; // kļūda
      }
    }
  }
?>