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
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
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
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
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Le lehet egyszerűsíteni:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 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
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
}
}
}
?>