Sono sotto l'interpretazione che se ho bisogno di accedere a un metodo staticamente, dovrei rendere astratta la classe solo se non avrò mai bisogno di un'istanza. È vero?in PHP, quando dovrei usare metodi statici o classi astratte?
risposta
Sono un po 'insicuro della domanda. I metodi statici sono molto diversi dalle classi astratte. Solitamente, crei una classe astratta se non vuoi che una classe sia istanziata, ma ti aspetti che le sottoclassi vengano istanziate. L'utilizzo di classi astratte può essere molto utile per creare una classe parzialmente implementata in cui le sottoclassi completeranno il resto dei metodi per implementare completamente la classe.
Una classe piena di metodi statici può essere dichiarata astratta se si desidera impedire l'utilizzo della classe, ma in generale direi che se si contrassegna un estratto di classe, si dovrebbe essere in grado di trovare classi che estendono la classe. Se ho una classe piena di metodi statici, I non è etichettandola come astratta perché nessuno la sottoclasse e generalmente aggiunge confusione. Preferirei che fosse chiamato una classe statica, non astratta.
PHP non ha identificatore statico sulle classi, quindi sono necessari altri metodi per impedire che venga creata un'istanza.
È possibile impedire l'istanziazione di una classe definendola astratta ed è un modo economico per farlo, anche se questo non è lo scopo di una classe astratta.
Altri metodi includono la definizione del contructor privato
private function __construct() {}
O un'eccezione nel contructor, se si vuole dare un messaggio più significativo sul motivo per cui non può essere istanziato.
function __construct() { throw new Exception('This is a static class'); }
Se non si desidera che la classe sottoclasse dichiari la classe finale.
final class foo { }
O nel caso dispari si vuole essere in grado di sottoclasse, ma non consentono da suoi figli creare un'istanza dichiarare la finale di costruzione. (Situazione inverosimile, ma per completezza)
final private function __construct() {}
- 1. Quando dovrei usare metodi statici?
- 2. Quando dovrei usare metodi pubblici/privati / statici?
- 3. Quando utilizzare le interfacce o classi astratte? Quando usare entrambi?
- 4. Quando utilizzare classi e metodi statici?
- 5. Metodi statici in PHP
- 6. Quando si dovrebbero usare metodi statici pubblici
- 7. django - quando dovrei usare media_root o static_root?
- 8. Variabili statiche PHP in classi astratte
- 9. Classe di utilità nell'applicazione Spring - dovrei usare metodi statici o no?
- 10. PHP ottenere metodi statici
- 11. Metodi statici su classi generiche?
- 12. Quando dovrei usare metodi statici in una classe e quali sono i vantaggi?
- 13. Quando dovrei usare package-private in Java?
- 14. Classi astratte (con metodi virtuali puri) in Cython
- 15. Come testare le classi astratte
- 16. Alternative alle classi astratte in Ruby?
- 17. Quando dovrei usare setUpClass e quando __init__?
- 18. Quando dovrei usare CompiledQuery?
- 19. Quando dovrei usare @JoinColumn o @JoinTable?
- 20. Alternatore costruttore per metodi statici in PHP
- 21. Test delle unità Classi astratte in Groovy
- 22. Perché dovrei usare le classi in python?
- 23. Metodi statici: quando e quando no
- 24. Java 8 - interfacce con metodi predefiniti vs classi astratte
- 25. Quando dovrei usare un prefisso sulle classi Objective C?
- 26. Classi C# - Perché tanti metodi statici?
- 27. Decoratori C#: interfacce o classi astratte?
- 28. dovrei nominare tutte le mie classi astratte AbstractFoo
- 29. C# Quando dovrei usare List e quando dovrei usare l'arraylist?
- 30. Quando dovrei usare # in ColdFusion?
Sicuramente; la semantica dell'astratto rispetto ad avere un costruttore privato è molto diversa, e l'uso di quella corretta dà un forte suggerimento a chiunque legga il codice su come viene usata la classe. – Rob