Problema de las propiedades privadas en la herencia de POO en PHP
El hecho de que las propiedades privadas no se hereden puede llevar a un problema inesperado. Veamos un ejemplo. Supongamos que tenemos la siguiente clase padre con una propiedad privada:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Supongamos que en la clase hija decidimos crear un método que incrementará la edad en uno. Sin embargo, el intento de cambiar la propiedad privada del padre conducirá a un error:
<?php
class Student extends User {
public function incAge() {
$this->age++; // error
}
}
?>
El error desaparecerá si en la clase hija
declaramos la propiedad privada $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
¡Aquí es donde nos espera la trampa! En realidad, hemos creado dos propiedades privadas: una en el padre y una en el hijo. Y funcionan completamente de forma independiente. Esto significa que los métodos del padre modificarán su propiedad, y los métodos del hijo - la suya.
Este problema en realidad tiene solución. Simplemente hay que manipular las propiedades privadas del padre a través de los métodos de ese padre. Reescribamos nuestro código de acuerdo con esto:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Se puede simplificar:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
En el siguiente código, en la clase hija se redefine un método del padre. Corrija los problemas en este código:
<?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; // error
}
}
}
?>