Problemet med privata egenskaper vid arv i OOP i PHP
Det faktum att privata egenskaper inte ärvs kan leda till ett oväntat problem. Låt oss titta på ett exempel. Antag att vi har följande föräldraklass med en privat egenskap:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Antag att vi i barnklassen bestämde oss för att skapa en metod som skulle öka åldern med ett. Men ett försök att ändra förälderns privata egenskap kommer att leda till ett fel:
<?php
class Student extends User {
public function incAge() {
$this->age++; // fel
}
}
?>
Felet försvinner om i barnklassen
deklareras den privata egenskapen $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Det är här fällan lurar! I verkligheten skapade vi två privata egenskaper: en i föräldern och en i barnet. Och de fungerar helt oberoende. Det betyder att förälderns metoder kommer att ändra sin egen egenskap, och barnets metoder - sina egna.
Detta problem har faktiskt en lösning. Man behöver bara manipulera förälderns privata egenskaper genom förälderns metoder. Låt oss skriva om vår kod i enlighet med detta:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Kan förenklas:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
I följande kod i barnklassen åsidosätts förälderns metod. Rätta till problemen i denna 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; // fel
}
}
}
?>