Проблема приватних својстава при наслеђивању у ООП у 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; // грешка
}
}
}
?>