Cuando se crea un nuevo objeto en PHP, me sale el siguiente mensaje de error:
Fatal error: Call to private MyObject::__construct() from invalid context
acabo de crear el nuevo objeto y no tratan de llamar el constructor explícitamente. ¿Alguien sabe lo que está pasando?Fatal error: Llamada a MiObjeto privada :: __ construct() de contexto no válido
Respuesta
Su clase MyObject
tiene un constructor privado o protegido, lo que significa que no se puede crear una instancia de la clase. Las funciones __construct()
siempre se invocan cuando se crea una instancia de un objeto, por lo que intentar hacer algo como $x = new MyObject()
causará un error fatal con una función de construcción privada. (Si no declaras específicamente una función __construct()
, se llamará al constructor padre).
Los constructores privados a menudo se usan en clases Singleton para evitar la creación de instancias directas de un objeto. Si no es una clase que ha creado, puede tener una función getInstance()
disponible (o algo similar) para devolver una instancia de sí mismo.
Eso funcionó, creo que he visto personas declarando constructores privados antes. ¿Hay alguna razón para hacer esto? – Brian
La única razón para hacerlo es si no desea que la clase sea instanciada por algún motivo. Como mencioné en la respuesta, el patrón Singleton es una razón popular por la que podría hacer esto (http://en.wikipedia.org/wiki/Singleton_pattern). – zombat
Los constructores privados a menudo son utilizados por implementaciones PHP del patrón Singleton, y algunas veces se usan con Factories. Por ejemplo, un método estático de fábrica de la clase puede buscar instancias de objetos en caché localmente y devolver una referencia en lugar de un nuevo objeto. Hacer el constructor privado evitará cualquier bypass accidental del método de fábrica. – Charles
En lugar de $x = new MyObject()
podría utilizar
$x = MyObject::getInstance();
suponiendo que MyObject
es una función Singleton y getInstance()
está disponible.
Para mí fue la de que el nombre de la CLASE era el mismo nombre que uno de los método s que era privado ...
por ejemplo ...
class myClass {
public function __construct() {
}
private function myClass() {
}
}
- 1. Fatal error: Llamada a socket_create función no definida()
- 2. Error fatal: llamada a la función no definida mcrypt_encrypt()
- 3. Error fatal: llamada a la función no definida sem_get()
- 4. Fatal error: Llamada a ldap_connect función no definida() en ubuntu
- 5. Fatal error: Llamada a openssl_random_pseudo_bytes función no definida()
- 6. Fatal error: Llamada a método no definido DateTime :: createFromFormat()
- 7. Error fatal: Llamada a la función no definida: imagecreate()
- 8. Error fatal: llamada a la función no definida mysql_connect()
- 9. Fatal error: Llamada a oci_connect función no definida()
- 10. <Error>: CGContextSaveGState: contexto no válido 0x0 Error
- 11. ¿Por qué hay un error de contexto no válido?
- 12. error 'contexto no válido 0x0' al utilizar funciones CGContext *
- 13. Git Intercambio de igual a igual: fatal: error de lectura: argumento no válido
- 14. Fatal error: No se puede acceder a la propiedad vacía
- 15. vC++ error de compilación RC: error fatal RC1107: uso no válido; usar RC /? para
- 16. Error de Git: fatal: no se puede conectar un socket (argumento no válido)
- 17. file_get_html pantallas Fatal error de una llamada a función no definida
- 18. Error fatal: Llamada a la función no definida get_header() en index.php en la línea 1
- 19. fatal: No es un nombre de objeto válido: 'maestro'
- 20. PHP Fatal error: El uso de esta $ cuando no está en contexto de objeto
- 21. Error fatal: tipos de operandos no admitidos
- 22. Catch PHP Fatal Error
- 23. PHP error de carácter no válido
- 24. Fatal error: no se puede mkdir R_TempDir
- 25. Fatal error: Class 'MySQLi' no encontrado
- 26. Error fatal: al usar $ this cuando no está en el contexto del objeto
- 27. git error fatal Ruta con a no tiene sentido
- 28. PHP Fatal error: No se puede volver a asignar $ this
- 29. PHP Error fatal: Class 'HttpRequest' no encontrado
- 30. Git Error fatal: información/árbitros no encontrado
crear un nuevo objeto siempre llamará al constructor. – Lukman