Esempio # 2 da manuale PHP http://php.net/manual/en/language.oop5.traits.php statiTratto PHP: esiste un modo corretto per garantire che la classe che utilizza un tratto estenda una super classe che contiene un determinato metodo?
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
Questo è il codice corretto, ma non è sicuro da usare parent::
in quel contesto. Diciamo che ho scritto la mia stessa classe 'Ciao mondo', che non eredita tutte le altre classi:
<?php
class MyOwnHelloWorld
{
use SayWorld;
}
?>
Questo codice non produrrà errori fino a quando chiamo il metodo sayHello()
. Questo non va bene.
D'altra parte se il tratto deve utilizzare un certo metodo Posso scrivere questo metodo come astratto, e questo è buono in quanto garantisce che il tratto sia usato correttamente in fase di compilazione. Ma questo non vale per le classi genitore:
<?php
trait SayWorld
{
public function sayHelloWorld()
{
$this->sayHello();
echo 'World!';
}
public abstract function sayHello(); // compile-time safety
}
Quindi la mia domanda è: C'è un modo per garantire (in fase di compilazione, non in fase di esecuzione), quella classe che utilizza un certo tratto avrà parent::sayHello()
metodo?
Quello che puoi fare è aggiungere un metodo astratto per forzare la classe usando quel tratto per avere il metodo che ti serve. in questo modo diventa indipendente dalla gerarchia di classe (l'idea dietro i tratti: P) – Jarry