Il manuale PHP così:
Tratti è un meccanismo di riutilizzo del codice in linguaggi successione singoli come PHP. Un tratto ha lo scopo di ridurre alcune limitazioni dell'ereditarietà singola consentendo a uno sviluppatore di riutilizzare insiemi di metodi liberamente in diverse classi indipendenti che vivono in diverse gerarchie di classi. La semantica della combinazione di Tratti e classi è definita in un modo che riduce la complessità ed evita i tipici problemi associati all'ereditarietà multipla e ai Mixin.
Se stai cercando di estendere un tratto, allora dovrebbe probabilmente essere una classe. Se hai una serie di metodi in una classe che vuoi usare in altri, ma sembra inappropriato estendere la classe (ad esempio class Animal extends Vehicle
), in PHP 5.4 potrebbe funzionare bene come tratto.
Per rispondere alla domanda in modo più diretto, non è possibile "estendere" un tratto, ma è possibile creare tratti che utilizzano altri tratti. Come per il manuale di PHP:
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}
trait World {
public function sayWorld() {
echo 'World!';
}
}
trait HelloWorld {
use Hello, World;
}
class MyHelloWorld {
use HelloWorld;
}
Si può considerare che questo è un modo per mantenere i tratti in gruppi logici, e di introdurre qualche modularità.
Modifica: avendo visto alcuni dei commenti, penso che valga la pena notare che l'utilizzo di un tratto in una classe base significa anche che il tratto è in qualsiasi classe che lo estende, e le funzioni del tratto hanno la precedenza sulla classe base ' . Inserirlo nella classe figlio non farebbe che rendere le funzioni del tratto non disponibili alla classe genitore/base.
Parent > Trait > Child
http://php.net/manual/en/language.oop5.traits.php
Come sarebbe 'Classe C usare T {}' essere diverso da quello che abbiamo già (a parte la sintassi leggermente diversa)? – Jon
Sintassi più breve quando voglio estendere alcune classi da una classe base ma usando i tratti. – Meglio
@Meglio: Fallo: 'La classe C estende Base {usa T}'. – hakre