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
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
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
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
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Mund të thjeshtohet:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Në kodin e mëposhtëm në klasën e bijës ridohet metoda e prindit. Korrigjoni problemet në këtë kod:
<?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
}
}
}
?>