Das Problem privater Eigenschaften bei der Vererbung in OOP in PHP
Dass private Eigenschaften nicht vererbt werden, kann zu einem unerwarteten Problem führen. Schauen wir uns ein Beispiel an. Nehmen wir an, wir haben die folgende Elternklasse mit einer privaten Eigenschaft:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Nehmen wir an, wir möchten in der Kindklasse eine Methode erstellen, die das Alter um eins erhöht. Der Versuch, die private Eigenschaft des Elternteils zu ändern, führt jedoch zu einem Fehler:
<?php
class Student extends User {
public function incAge() {
$this->age++; // Fehler
}
}
?>
Der Fehler verschwindet, wenn in der Kindklasse
die private Eigenschaft $age deklariert wird:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Hier lauert die Falle! Tatsächlich haben wir zwei private Eigenschaften erzeugt: eine im Elternteil und eine im Kind. Und diese arbeiten völlig unabhängig voneinander. Das bedeutet, dass die Methoden des Elternteils seine Eigenschaft ändern und die Methoden des Kindes - seine eigene.
Dieses Problem hat tatsächlich eine Lösung. Man muss einfach die privaten Eigenschaften des Elternteils über die Methoden dieses Elternteils manipulieren. Schreiben wir unseren Code entsprechend um:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Man kann es vereinfachen:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Im folgenden Code wird in der Kindklasse die Methode des Elternteils überschrieben. Korrigieren Sie die Probleme in diesem Code:
<?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; // Fehler
}
}
}
?>