Problema proprietăților private la moștenire în OOP în PHP
Faptul că proprietățile private nu sunt moștenite, poate duce la o problemă neașteptată. Să vedem un exemplu. Să presupunem că avem următoarea clasă-părinte cu o proprietate privată:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Să presupunem că în clasa-descendent am decis să creăm o metodă care va crește vârsta cu o unitate. Însă, încercarea de a modifica proprietatea privată a părintelui va duce la o eroare:
<?php
class Student extends User {
public function incAge() {
$this->age++; // eroare
}
}
?>
Eroarea va dispărea dacă în clasa-descendent
declarăm o proprietate privată $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Aici ne așteaptă capcana! De fapt, am generat două proprietăți private: una în părinte și una în descendent. Și ele funcționează complet independent. Aceasta înseamnă că metodele părintelui vor modifica propria lor proprietate, iar metodele descendentului - propriile lor.
Această problemă are de fapt o soluție. Pur și simplu trebuie să manipulăm proprietățile private ale părintelui prin metodele acestui părinte. Să rescriem codul nostru în conformitate cu aceasta:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Putem simplifica:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
În următorul cod în clasa descendentă este redefinită metoda părintelui. Corectați problemele din acest cod:
<?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; // eroare
}
}
}
?>