A privát tulajdonságok örökléssel kapcsolatos problémája az OOP-ban PHP-ben

Az, hogy a privát tulajdonságok nem öröklődnek, váratlan problémához vezethet. Nézzük meg ezt egy példán keresztül. Tegyük fel, hogy a következő szülő osztályunk van egy privát tulajdonsággal:

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

Tegyük fel, hogy a gyermek osztályban úgy döntöttünk, hogy készítünk egy metódust, amely eggyel növeli a kort. Mindazonáltal, a szülő privát tulajdonságának megváltoztatására tett kísérlet hibához vezet:

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

A hiba eltűnik, ha a gyermek osztályban deklaráljuk a $age privát tulajdonságot:

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

Itt vár ránk a csapda! Valójában két privát tulajdonságot hoztunk létre: egyet a szülőben és egyet a gyermekben. És ezek teljesen függetlenül működnek. Ez azt jelenti, hogy a szülő metódusai a saját tulajdonságukat módosítják, a gyermek metódusai pedig a sajátjaikat.

Ennek a problémának valójában van megoldása. Egyszerűen a szülő privát tulajdonságaival a szülő metódusain keresztül kell dolgozni. Írjuk át a kódunkat ennek megfelelően:

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

Le lehet egyszerűsíteni:

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

A következő kódban a gyermek osztályban felülírjuk a szülő metódusát. Javítsa ki a problémákat ebben a kódban:

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