Quando si crea un nuovo oggetto in PHP, ottengo il seguente messaggio di errore:
Fatal error: Call to private MyObject::__construct() from invalid context
Ho appena creare il nuovo oggetto e non cercare di chiamare il costruttore esplicitamente. Qualcuno sa cosa sta succedendo?Fatal error: Call to MyObject privato :: __ construct() dal contesto non valido
risposta
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.
Questo ha funzionato, penso di aver visto persone che dichiarano costruttori privati in passato. C'è qualche ragione per farlo? – Brian
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
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
Invece di $x = new MyObject()
si potrebbe usare
$x = MyObject::getInstance();
assumendo che MyObject
è una funzione Singleton e getInstance()
è disponibile.
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() {
}
}
- 1. Fatal error: Call to undefined function openssl_random_pseudo_bytes()
- 2. CakePHP - Fatal error: Call to undefined function
- 3. Fatal error: Call to metodo non definito DateTime :: createfromformat()
- 4. PHP Fatal error: Call to funzione session_register indefinito()
- 5. Fatal error: Usando $ this quando non in contesto oggetto in
- 6. Codeigniter error: Call to undefined function mysql_pconnect()
- 7. PHP Fatal error: Call to un formato funzione membro() su booleani
- 8. Fatal error: Class 'OAuth' non trovato in
- 9. Fatal error: eccezione Uncaught 'Eccezione' con il messaggio 'DateTime :: __ construct(): Impossibile analizzare la stringa tempo
- 10. Fatal error: 'imagick' Classe non trovata
- 11. Fatal Error - Troppi file aperti
- 12. Fatal error: 'XSLTProcessor' di classe non trovata
- 13. Fatal error: Class 'MySQLi' non trovato
- 14. FATAL ERROR "postmaster.pid" esiste già
- 15. Grunt: Fatal error: orologio EPERM
- 16. Tasto privato non valido SharpSSH
- 17. Mock call to write()
- 18. Fatal error su "git add sottomodulo"
- 19. PHP Fatal error: Impossibile riassegnare $ this
- 20. Fatal error: Class 'Illuminate \ Fondazione \ Application' non trovato
- 21. Fatal error compilazione: non tools.jar trovato - Maven-compiler-plugin
- 22. PHP Fatal error: Class 'Memcached' non trovato in
- 23. PHP MongoDB: Fatal error: 'MongoClient' di classe non trovata
- 24. Fatal error: 'Memcache' classe non si trovano in
- 25. reCaptcha mostra "input error: referer non valido"
- 26. Reindirizzamento laravel dal metodo privato
- 27. call finish() dal metodo statico
- 28. Make to La conversione preventiva dipende dal contesto
- 29. LINQ to SQL ForeignKeyReferenceAlreadyHasValueException error
- 30. Errore iOS - CGContextRestoreGState: contesto non valido 0x0
la creazione di un nuovo oggetto chiamerà sempre il costruttore. – Lukman