Težava z zasebnimi lastnostmi pri dedovanju v OOP v PHP

Dejstvo, da se zasebne lastnosti ne dedujejo, lahko povzroči nepričakovano težavo. Poglejmo si primer. Recimo, da imamo naslednji starševski razred z zasebno lastnostjo:

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

Recimo, da smo v podrejenem razredu želeli narediti metodo, ki bo povečala starost za ena. Vendar poskus spreminjanja zasebne lastnosti starša bo povzročil napako:

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

Napaka bo izginila, če v podrejenem razredu deklariramo zasebno lastnost $age:

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

Tu nas čaka past! Pravzaprav smo ustvarili dve zasebni lastnosti: eno v staršu in eno v potomcu. In delujeta povsem neodvisno. To pomeni, da bodo metode starša spreminjale svojo lastnost, metode potomca pa svojo.

Ta težava ima pravzaprav rešitev. Preprosto je treba upravljati z zasebnimi lastnostmi starša prek metod tega starša. Prepišimo našo kodo v skladu s tem:

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

Lahko poenostavimo:

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

V naslednji kodi se v podrejenem razredu prepiše metoda starša. Popravite težave v tej kodi:

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