Проблема на приватни својства при наследување во ООП во PHP
Тоа што приватните својства не се наследуваат, може да доведе до неочекуван проблем. Да погледнеме на пример. Нека имаме следнава родителска класа со приватно својство:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Нека во класата-потомок одлучиме да направиме метод, кој ќе го зголемува возраста за еден. Сепак, обидот да се промени приватното својство на родителот ќе доведе до грешка:
<?php
class Student extends User {
public function incAge() {
$this->age++; // грешка
}
}
?>
Грешката ќе исчезне ако во класата-потомок
се декларира приватно својство $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Тука нè чека стапица! Всушност, создадовме две приватни својства: едно во родителот и едно во потомокот. И тие работат потполно независно. Ова значи дека методите на родителот ќе го менуваат своето својство, а методите на потомокот - своето.
Овој проблем всушност има решение. Едноставно треба да се манипулира со приватните својства на родителот преку методите на тој родител. Да го преработиме нашиот код во согласност со ова:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Може да се поедностави:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Во следниот код во класата потомок се преопределува методот на родителот. Исправете ги проблемите во овој код:
<?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; // грешка
}
}
}
?>