PHP-də OOP-də Miras zamanı Privat Xüsusiyyətlər Problemi
Privat xüsusiyyətlərin miras alınmaması, gözlənilməz bir problemə səbəb ola bilər. Gəlin bir nümunə ilə baxaq. Tutaq ki, bizim aşağıdakı kimi valideyn sinfi və onun privat xüsusiyyəti var:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Tutaq ki, törəmə sinifdə biz yaşı bir vahid artıran bir metod etmək qərarına gəldik. Lakin, valideynin privat xüsusiyyətini dəyişməyə cəhd xətaya səbəb olacaq:
<?php
class Student extends User {
public function incAge() {
$this->age++; // xəta
}
}
?>
Xəta yox olacaq, əgər törəmə sinifdə
privat xüsusiyyət $age elan etsək:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Bizi burada tələ gözləyir! Əslində biz iki privat xüsusiyyət yaratmışıq: biri valideyndə, digəri isə törəmədə. Və onlar tamamilə müstəqil işləyir. Bu o deməkdir ki, valideyn metodları öz xüsusiyyətlərini, törəmə metodları isə öz xüsusiyyətlərini dəyişəcək.
Bu problemin həll yolu var. Sadəcə, valideynin privat xüsusiyyətləri o valideynin metodları vasitəsilə idarə edilməlidir. Gəlin kodumuzu buna uyğun olaraq yenidən yazaq:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Sadələşdirmək olar:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Aşağıdakı kodda törəmə sinifdə valideyn metodu yenidən təyin olunur. Bu koddakı problemləri düzəldin:
<?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; // xəta
}
}
}
?>