Problemi i vetive private në trashëgiminë në OOP në PHP

Fakti që vetitë private nuk trashëgohen, mund të çojë në një problem të papritur. Le të shohim një shembull. Le të themi se kemi klasën prind të mëposhtme me një veti private:

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

Le të themi se në klasën e bijës kemi vendosur të bëjmë një metodë që do të rrisë moshën me një. Megjithatë, përpjekja për të ndryshuar vetinë private të prindit do të çojë në gabim:

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

Gabimi do të zhduket nëse në klasën e bijës deklarohet vetia private $age:

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

Këtu na pret kurtha! Në realitet ne kemi krijuar dy veti private: një në prind dhe një në bijë. Dhe ato punojnë plotësisht të pavarura. Kjo do të thotë që metodat e prindit do të ndryshojnë vetinë e tyre, dhe metodat e bijës - vetitë e tyre.

Ky problem në fakt ka zgjidhje. Thjesht duhet të manipuloni vetitë private të prindit përmes metodave të atij prindi. Le të rishkruajmë kodin tonë në përputhje me këtë:

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

Mund të thjeshtohet:

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

Në kodin e mëposhtëm në klasën e bijës ridohet metoda e prindit. Korrigjoni problemet në këtë 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; // gabim
      }
    }
  }
?>