Privāto īpašību problēma mantojumā OOP PHP
Tas, ka privātās īpašības nemantojas, var izraisīt negaidītu problēmu. Apskatīsim to ar piemēru. Pieņemsim, ka mums ir šāda vecāku klase ar privātu īpašību:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Pieņemsim, ka bērna klasē mēs nolēmām izveidot metodi, kas palielinās vecumu par vienu. Tomēr mēģinājums mainīt vecāka privāto īpašību izraisīs kļūdu:
<?php
class Student extends User {
public function incAge() {
$this->age++; // kļūda
}
}
?>
Kļūda pazudīs, ja bērna klasē
deklarēsiet privāto īpašību $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Šeit mūs sagaida lamatas! Patiesībā mēs esam radījuši divas privātas īpašības: vienu vecākā klasē un vienu bērna klasē. Un tās darbojas pilnīgi neatkarīgi. Tas nozīmē, ka vecāka metodes mainīs savu īpašību, un bērna metodes - savas.
Šai problēmai patiesībā ir risinājums. Vienkārši ir jāpārvalda vecāka privātās īpašības caur šī vecāka metodēm. Pārrakstīsim mūsu kodu saskaņā ar to:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Var vienkāršot:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Nākamajā kodā bērna klasē tiek pārdefinēta vecāka metode. Izlabojiet problēmas šajā 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; // kļūda
}
}
}
?>