Le interfacce in PHP hanno proprietà o hanno solo metodi?Le interfacce PHP hanno proprietà?
risposta
Dipende da cosa intendi per "proprietà". Se intendi campi reali, allora no, non lo fanno. Se ti riferisci a proprietà come quelle in C#, allora sì possono (dato che gli accessor di proprietà sono lo zucchero strettamente sintattico per i metodi accessor comunque). Lo stesso vale per gli eventi (anche se, naturalmente, in ciascun caso, non è specificata alcuna implementazione per gli strumenti di accesso get
/set
o add
/remove
).
Aggiornamento: Dal momento che PHP non ha proprietà nel senso di get
/set
di accesso, quindi la risposta alla tua domanda è no. Le interfacce non possono trasportare i propri dati/stato.
Le costanti sono considerate dati in alcune cerchie. ymmv –
@ nickl- Quei cerchi sono pazzi perché lo stato cambia, le costanti no. – mpen
Le interfacce PHP possono avere costanti, ma non proprietà (variabili di istanza). Se non hai bisogno di modificare la tua "proprietà", puoi invece utilizzare una costante.
Le interfacce in PHP possono contenere solo il metodo pubblico firme senza un corpo del metodo. Possono anche contenere costanti. Ma è così. Nient'altro.
Vedi http://www.php.net/manual/en/language.oop5.interfaces.php
interfacce sono definite utilizzando la parola chiave interface, nello stesso modo di una classe standard, ma senza qualsiasi dei metodi aventi le loro contenuti definiti. [...] Tutti i metodi dichiarati in un'interfaccia devono essere pubblici, questa è la natura di un'interfaccia. [...] È possibile che le interfacce abbiano costanti. Le costanti di interfaccia funzionano esattamente come le costanti di classe, eccetto che non possono essere sovrascritte da una classe/interfaccia che la eredita.
Il motivo [valido] per richiedere le proprietà in un'interfaccia è specificare che una classe DTO ha un determinato aspetto, ad es. IOrderable {OrderDate, OrderStatus}, IDeliverable {DeliveryAddress, Route, ...}, ecc. L'aspetto può essere utilizzato in un numero di DTO, ad es. Ordine di vendita, Ordine di lavoro, Fatture di vendita, ecc. Una classe DTO può supportare più aspetti, ad esempio l'ereditarietà multipla che è desiderabile nelle Classi di dati (ma non nelle Classi di codice). Successivamente, il cliente del DTO ha la certezza di poter visualizzare il DTO attraverso questo aspetto (un contratto di interfaccia). Questo modello si attiene a tutti e 5 i principi SOLID.
In PHP, il più vicino che si deve interfacciare le proprietà è i tratti http://php.net/manual/en/language.oop5.traits.php. Analogamente alle interfacce, i tratti non possono essere istanziati, tuttavia possono essere utilizzati direttamente nelle classi senza implementarli.
Un tratto non è in alcun modo simile a un'interfaccia "proprietà" - né è affatto simile a un'interfaccia. Questa è solo errata –
Un'interfaccia è un progetto per i metodi di una classe, un tratto è un gruppo di metodi/proprietà che possono essere facilmente condivisi tra le classi senza utilizzare l'ereditarietà o l'iniezione di dipendenza. –
@A_funs Modificato la mia risposta per chiarire il punto – Michael
* (riferimento) * http://www.php.net/manual/en/language.oop5.interfaces.php – Gordon
La domanda era ragionevole, si potrebbe pensare a una proprietà pubblica di una classe come parte dell'interfaccia pubblica di tali classi e si potrebbe desiderare di forzare le classi che implementano un'interfaccia per rendere disponibile una determinata proprietà denominata. Ma non puoi - quindi devi solo avere i metodi getProperty() setProperty() nell'interfaccia - che non è una cosa negativa dato che tutti sanno che le proprietà pubbliche sono malvagie (lo sappiamo tutti, no? ? non sono?) –