2009-10-07 19 views

risposta

3

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.

+0

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

6

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() {} 
Problemi correlati