Το πρόβλημα των ιδιωτικών ιδιοτήτων κατά την κληρονομικότητα στην ΑΟΠ στην PHP
Το γεγονός ότι οι ιδιωτικές ιδιότητες δεν κληρονομούνται, μπορεί να οδηγήσει σε ένα απρόσμενο πρόβλημα. Ας δούμε ένα παράδειγμα. Ας υποθέσουμε ότι έχουμε την ακόλουθη γονική κλάση με μια ιδιωτική ιδιότητα:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Ας υποθέσουμε ότι στην παιδική κλάση αποφασίσαμε να φτιάξουμε μια μέθοδο που θα αυξάνει την ηλικία κατά μία μονάδα. Ωστόσο, η προσπάθεια να αλλάξουμε την ιδιωτική ιδιότητα του γονέα θα οδηγήσει σε σφάλμα:
<?php
class Student extends User {
public function incAge() {
$this->age++; // σφάλμα
}
}
?>
Το σφάλμα θα εξαφανιστεί εάν στην παιδική κλάση
δηλώσουμε την ιδιωτική ιδιότητα $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Εδώ μας περιμένει η παγίδα! Στην πραγματικότητα δημιουργήσαμε δύο ιδιωτικές ιδιότητες: μία στον γονέα και μία στον απόγονό. Και λειτουργούν εντελώς ανεξάρτητα. Αυτό σημαίνει ότι οι μέθοδοι του γονέα θα τροποποιούν τη δική τους ιδιότητα, ενώ οι μέθοδοι του απογόνου - τις δικές τους.
Αυτό το πρόβλημα στην πραγματικότητα έχει λύση. Απλά χρειάζεται να χειριζόμαστε τις ιδιωτικές ιδιότητες του γονέα μέσω των μεθόδων αυτού του γονέα. Ας ξαναγράψουμε τον κώδικά μας σύμφωνα με αυτό:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Μπορούμε να απλοποιήσουμε:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Στον επόμενο κώδικα, στην παιδική κλάση υπερκαλύπτεται η μέθοδος του γονέα. Διορθώστε τα προβλήματα σε αυτόν τον κώδικα:
<?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; // σφάλμα
}
}
}
?>