In questo articolo illustreremo le basi dell'ereditarietà nella programmazione OO in PHP.
Partiamo da questa classe base:
class Bicycle {
public $cadence;
public $gear;
public $speed;
public function __construct($startCadence, $startSpeed, $startGear) {
$this->cadence = $startCadence;
$this->gear = $startGear;
$this->speed = $startSpeed;
}
public function setCadence($value) {
$this->cadence = $value;
}
public function setGear($value) {
$this->gear = $value;
}
public function applyBrake($decrement) {
$this->speed -= $decrement;
}
public function speedUp($increment) {
$this->speed += $increment;
}
}
La classe ha tre proprietà e quattro metodi, di cui due sono dei canonici setter e gli altri due incrementano e decrementano il valore di una proprietà.
Questa classe fungerà da genitrice per la classe figlia, che ne erediterà le proprietà e i metodi. Possiamo aggiungere altri metodi e proprietà alla classe figlia in modo da personalizzarne la struttura.
A differenza di Java, PHP non supporta i costruttori multipli per l'overloading (può esserci un solo __construct()
) ma offre la possibilità di invocare il costruttore della classe genitrice tramite la parola chiave parent
(in Java è super
). Questa caratteristica risulta utile quando si vogliono impostare i valori per le proprietà ereditate.
PHP, come Java, utilizza la parola chiave extends
per l'ereditarietà:
class MountainBike extends Bicycle {
public $seatHeight;
public function __construct($startHeight, $startCadence, $startSpeed, $startGear) {
parent::__construct($startCadence, $startGear, $startSpeed);
$this->seatHeight = $startHeight;
}
public function setHeight($value) {
$this->seatHeight = $value;
}
}
La classe figlia inizializza i valori delle proprietà della classe genitrice nel suo costruttore invocando il costruttore della classe base. In più aggiunge una sua proprietà specifica con il relativo metodo setter.
Esempio:
$mountainBike = new MountainBike(80, 20, 20, 20);
echo 'Accelerate!' . '<br>';
$mountainBike->speedUp(20); // Ora MountainBike::speed è 40
echo $mountainBike->speed . '<br>';
echo 'Decelerate!' . '<br>';
$mountainBike->applyBrake(10); // Ora MountainBike::speed è 30
echo $mountainBike->speed;