Privačių savybių paveldėjimo problema OOP PHP
Tai, kad privačios savybės nepaveldimos, gali sukelti netikėtą problemą. Pažiūrėkime pavyzdžiu. Tarkime, mes turime šį tėvinę klasę su privačia savybe:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Tarkime, vaikinėje klasėje mes nusprendėme sukurti metodą, kuris padidins amžių vienetu. Tačiau bandymas pakeisti tėvinės klasės privačią savybę sukels klaidą:
<?php
class Student extends User {
public function incAge() {
$this->age++; // klaida
}
}
?>
Klaida išnyks, jei vaikinėje klasėje
deklaruosite privačią savybę $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Štai čia mūsų ir laukia spastai! Iš tikrųjų mes sukūrėme dvi privačias savybes: vieną tėvinėje klasėje ir vieną vaikinėje klasėje. Ir jos veikia visiškai nepriklausomai. Tai reiškia, kad tėvinės klasės metodai keis savo savybę, o vaikinės klasės metodai - savo.
Ši problema iš tikrųjų turi sprendimą. Tiesiog reikia manipuliuoti tėvinės klasės privačiomis savybėmis per tos tėvinės klasės metodus. Perrašykime savo kodą pagal tai:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Galima supaprastinti:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Šiame kode vaikinėje klasėje perrašomas tėvinės klasės metodas. Ištaisykite problemas šiame kode:
<?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; // klaida
}
}
}
?>