2010-01-04 12 views

risposta

20

La classe MyObject ha un costruttore protected o private, il che significa che la classe non è possibile creare un'istanza. Le funzioni __construct() vengono sempre chiamate quando un oggetto viene istanziato, quindi provare a fare qualcosa come $x = new MyObject() causerà un errore fatale con una funzione di costruzione privata. (Se non si specifica specificamente una funzione __construct(), verrà chiamato il costruttore genitore).

I costruttori privati ​​vengono spesso utilizzati nelle classi Singleton per impedire l'istanziazione diretta di un oggetto. Se non è una classe che hai creato, potrebbe avere una funzione getInstance() disponibile (o qualcosa di simile) per restituire un'istanza di se stessa.

+0

Questo ha funzionato, penso di aver visto persone che dichiarano costruttori privati ​​in passato. C'è qualche ragione per farlo? – Brian

+1

L'unica ragione per farlo è se non si desidera che la classe venga istanziata per qualche motivo. Come ho accennato nella risposta, il pattern Singleton è un motivo popolare per farlo (http://en.wikipedia.org/wiki/Singleton_pattern). – zombat

+1

I costruttori privati ​​vengono spesso utilizzati dalle implementazioni PHP del modello Singleton e vengono talvolta utilizzati con le fabbriche. Ad esempio, un metodo statico di fabbrica della classe può cercare istanze di oggetti memorizzati localmente e restituire un riferimento anziché un nuovo oggetto. Rendere privato il costruttore impedirà eventuali bypass accidentali del metodo factory. – Charles

0

Invece di $x = new MyObject() si potrebbe usare

$x = MyObject::getInstance(); 

assumendo che MyObject è una funzione Singleton e getInstance() è disponibile.

2

Per me la sua era che il nome del CLASS era lo stesso nome di uno dei metodi s che era privata ...

per esempio ...

class myClass { 

    public function __construct() { 

    } 

    private function myClass() { 

    } 
} 
Problemi correlati