2014-04-19 12 views
11

Le mie applicazioni PHP utilizzano generalmente classi per il namespace. I metodi all'interno di queste classi sono definiti come statici.PHP: quando utilizzare i tratti e quando utilizzare i metodi statici?

Ora che PHP ha introdotto i tratti, sto cercando di capire quando usarli. Ho visto alcuni esempi di utilizzo dei tratti, ma penso che questo potrebbe essere facilmente implementato attraverso un metodo di classe statico.

Un esempio abbastanza approfondita utilizzando un logger è stato elencato qui: Traits in PHP – any real world examples/best practices?

Ma perché usare un Tratto, se si potrebbe anche usare un Logger statica :: log()? L'unica cosa che riesco a pensare solo ora, è un facile accesso a $ questo. Un altro esempio che sto affrontando adesso è una funzione utente esistente. Tratta, o metodo statico vero?

Qualcuno può far luce su questo?

+1

Entrambi tutti schifosissimi da usare in un codice base imho. – PeeHaa

+0

@PeeHaa si prega di elaborare? – Greggg

+0

Entrambi rendono difficile testare il codice dell'unità, a causa dell'accoppiamento stretto. Oltre a mantenerlo/debuggarlo perché in qualche modo un pezzo magico di codice "esterno" viene "importato" nella classe. – PeeHaa

risposta

12

Dopo aver letto i commenti sulla questione, il mio prendere su La risposta è questa:

Tratti consentono l'estensione di una classe senza che sia parte della gerarchia delle classi. Non c'è bisogno di qualcosa come class Book extends Loggable, poiché Book non è un Loggable, vogliamo solo la funzionalità Loggable. La funzionalità all'interno di Loggable potrebbe essere inserita in un tratto, quindi essere in grado di utilizzare i metodi di Loggable all'interno di Book come se ne stessimo estendendo.

Il vantaggio di utilizzare i tratti sopra l'uso di metodi statici all'interno di classi (o funzioni con spazi dei nomi) è che il tratto ha accesso all'ambito di classe completo, anche membri privati.

Lo svantaggio di utilizzare funzioni statiche invece di tratti, è l'accoppiamento stretto (dipendenze) tra le classi, che danneggia la riusabilità e può danneggiare il test delle unità (ad esempio quando si utilizzano i servizi di simulazione). Le dipendenze devono essere iniettate in fase di runtime, il che aumenta lo sforzo di istanziare una classe/metodo, ma consente una maggiore flessibilità sull'intera app. Questa è stata una nuova intuizione per me.

-3

I tratti possono accedere a membri privati ​​di oggetti.

Problemi correlati