2012-07-17 12 views
11

Mi chiedo se non v'è alcuna buona ragione per cui questo comportamento è possibile in PHP corrente 5.4 implementazione:PHP 5.4: perché le classi possono sovrascrivere i metodi dei tratti con una firma diversa?

trait T { 
    public function test(PDO $pdo) {} 
} 

class C { 
    use T; 
    public function test(DOMDocument $dom) {} 
} 

ho pensato che il fatto che una classe utilizza un tratto, garantito che questa classe ha avuto una specifica interfaccia disponibile. Ma qui, se inavvertitamente sovrascriviamo il metodo tratto per un altro scopo, non riceviamo nemmeno un avviso di norme rigorose, come nel caso dell'ereditarietà classica.

È specificamente consentito? Per che cosa?

risposta

26

Questo comportamento è documentato. Da php.net (http://php.net/manual/en/language.oop5.traits.php):

Un membro ereditato da una classe di base viene sovrascritto da un membro inserita da un tratto. L'ordine di precedenza è che i membri della classe corrente eseguono l'override dei metodi Trait, che in cambio sostituiscono i metodi ereditati da .

Nessun motivo per le notifiche qui.

Edit:

ho preso uno sguardo su una certa letteratura più grave di fare luce su questo argomento :). Sembra che tale comportamento faccia parte della definizione dei tratti. Stanno lavorando in questo modo. Questo è da ricerca "Tratti: Unità componibili di comportamento" (Atti della Conferenza europea sulla programmazione orientata agli oggetti):

Un'altra proprietà di composizione caratteristica è che l'ordine composizione è irrilevante, e quindi con fl contrastanti metodi tratto deve essere esplicitamente disambiguato (vedere la sezione 3.5). I conflitti tra i metodi definiti nelle classi e i metodi definiti dai tratti incorporati vengono risolti utilizzando le seguenti due regole di precedenza.

- I metodi di classe hanno la precedenza sui metodi dei tratti.

- I metodi dei tratti hanno la precedenza sui metodi della superclasse. Questo deriva dalla proprietà di chiarire che afferma che i metodi di tratto si comportano come se fossero definiti nella classe stessa.

Si può leggere di più qui: http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf

+0

Grazie per la risposta, lo fa in effetti dicono che la classe può sovrascrivere i metodi del tratto, ma non dice il motivo per cui può sovrascrivere con una firma diversa! – Benjamin

+0

Ho aggiornato il mio post. – Eugene

+0

Come noto, i tratti in PHP sovrascrivono il metodo allo stesso modo ereditato, il che significa nessun controllo della firma, solo il nome del metodo. – Timur

Problemi correlati