Die probleem van private eienskappe by oorerwing in OOP in PHP
Die feit dat private eienskappe nie oorgeerf word nie, kan tot 'n onverwagte probleem lei. Kom ons kyk na 'n voorbeeld. Gestel ons het die volgende ouerklas met 'n private eienskap:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Gestel ons besluit in die afgeleide klas om 'n metode te maak wat die ouderdom met een sal verhoog. Maar, 'n poging om die private eienskap van die ouer te verander sal tot 'n fout lei:
<?php
class Student extends User {
public function incAge() {
$this->age++; // fout
}
}
?>
Die fout sal verdwyn as jy in die afgeleide klas
die private eienskap $age verklaar:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Dis hier waar die strik op ons wag! Eintlik het ons twee private eienskappe geskep: een in die ouer en een in die afstammeling. En hulle werk heeltemal onafhanklik. Dit beteken dat die metodes van die ouer hul eie eienskap sal verander, en die metodes van die afstammeling - hulle s'n.
Hierdie probleem het eintlik 'n oplossing. Jy moet net die private eienskappe van die ouer manipuleer deur die metodes van daardie ouer. Kom ons herskryf ons kode volgens dit:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Kan vereenvoudig word:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
In die volgende kode in die afgeleide klas word die metode van die ouer oorverteenwoordig. Korrigeer die probleme in hierdie 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; // fout
}
}
}
?>