2011-10-26 27 views
13

¿Por qué no puedo usar código como este?¿Por qué PHP no tiene un constructor predeterminado?

<?php 

class NoConstructor { 
} 

class ChildWithConstructor extends NoConstructor { 
    public function __construct() { 
     parent::__construct(); 
     // do something 
    } 
} 

$foo = new ChildWithConstructor(); 
// **Fatal error: Cannot call constructor in file.php on line 8** 

Eg. Las clases de Java tienen predeterminado, no args constructor. Se puede invocar incluso si no está definido explícitamente.

El comportamiento de PHP puede causar problemas cuando no eliminamos el constructor args de la clase padre, por ejemplo. cuando pensamos que no se necesita más.

¿Alguien sabe por qué los creadores de PHP lo hicieron de esta manera?

+1

Al lado de su pregunta, se debe mencionar que puede solucionar esto: verifique la existencia de la función antes de llamar. –

+6

Los creadores de PHP tomaron * muchas * decisiones tontas ... –

+1

http://www.php.net/manual/en/function.is-callable.php: if (is_callable ('parent :: __ construct')) { parent :: __ construct(); } –

Respuesta

20

clases Java tienen por defecto, sin argumentos constructor.

¿Alguien sabe por qué los creadores de PHP lo hicieron de esta manera?

Java era un lenguaje planificado. Fue rigurosamente considerado y formalmente especificado desde el principio. Fue pensado para durar el mayor tiempo posible con cambios mínimos en aras de la compatibilidad con versiones anteriores y posteriores, por simplicidad para los desarrolladores y ejecutores por igual. Definitivamente no tuvo éxito en la medida que esperaban, pero aún puede tomar el código Java 1.0, compilarlo y ejecutarlo en máquinas virtuales modernas.

Los diseñadores de PHP nunca planearon el lenguaje casi en un extremo. Lo inventan a medida que avanzan. Para bien o para mal, están moderadamente dispuestos a separar el idioma y reconstruirlo en la próxima versión. Ha cambiado de manera irreconocible desde PHP 1 y 2. Incluso recientemente, en PHP 5, usted tuvo el cambio dramático de la semántica de los valores por valor a por referencia para los objetos.Es esa misma metodología brillante que nos trajo citas mágicas, la falta de Unicode, funciones nombradas inconsistentemente (y con frecuencia renombradas), y un analizador sintáctico que sin siquiera un atisbo de error (incluso con error_reporting(-1);) interpretará alegremente el literal numérico 09 como 0 .

El comportamiento de PHP puede causar problemas cuando no eliminamos el constructor args de la clase principal, por ejemplo. cuando pensamos que no se necesita más.

Se podría solicitar este puede cambiar en bugs.php.net, pero lo más probable es que van a ignorarlo o fob con "Lo sentimos, pero su problema no implica un problema en sí PHP ... ".

+2

+1, esta es la única respuesta que aborda la pregunta. – Brad

1

Antes de PHP 5 el constructor tenía el mismo nombre que la clase, como JAVA. En PHP 5, una clase puede tener un método constructor con el mismo nombre que la clase (si no está en un espacio de nombres) o con el nombre __construct. Quizás tiene algo que ver con eso.

4

Como vimos con el 5.3.7 disaster, el desarrollo de PHP podría necesitar un poco más de estabilidad. Además, PHP es diferente en muchas formas más.

  • Enterprise Backup no está en la misma liga (sin Oracle, sin IBM, etc.)
  • PHP es viejo, ya veces incoherente,
  • del intérprete PHP (Zend Engine) tiene que ser capaz de hacer muy mucho, al soportar tantos constructos heredados y paradigmas de programación.
  • El origen de PHP es un lenguaje de script simple para los aficionados.

Me gusta mucho PHP y trabajo con él a diario, pero a veces es solo un pequeño capricho. Por otro lado, si elimina __construct() hay dos cosas que debe considerar.

  1. Nunca lo hacen, simplemente vaciar el constructor
  2. Si usted está construyendo un marco init hacen funciones de un concepto central, ya que estos son aún buenas prácticas.

me refiero a esto:

class BaseClass { 
    public function __construct() { 
     if(method_exists($this, 'init') { 
      $this->init(); 
     } 
    } 
} 
1

La línea

parent::__construct(); 

es una llamada explícita al constructor de la clase padre. "PHP" te está dando un error porque no existe.

¿Se puede llamar explícitamente al constructor no existente de uno de los padres en Java y no obtener un error?

Recuerde que el constructor de una clase que extiende una clase principal anulará el constructor de la clase principal cuando se construya la clase que se extiende. Llamar a un constructor padre implica que esperas que haga algo. Si el constructor no existe, su llamada no pertenece al código, ya sea que el intérprete le haya dado un error o no.

+0

En Java no existe una clase sin un constructor; el compilador agrega uno si no está escrito en el código fuente. Ver https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9 – bdsl

Cuestiones relacionadas