2011-10-26 23 views
13

Perché non posso usare un codice come questo?Perché PHP non ha un costruttore predefinito?

<?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** 

Es. Le classi Java hanno default, nessun costruttore di args. Può essere chiamato anche se non è definito in modo esplicito.

Il comportamento di PHP può causare problemi quando non si rimuove il costruttore di args dalla classe padre, ad es. quando pensiamo che non è più necessario.

Qualcuno sa perché i creatori di PHP hanno fatto in questo modo?

+1

Accanto alla domanda, è necessario ricordare che è possibile aggirare il problema: verificare la presenza della funzione prima della chiamata. –

+6

I creatori di PHP hanno fatto un * sacco * di decisioni sciocche ... –

+1

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

risposta

20

classi Java hanno di default, non args costruttore.

Qualcuno sa perché i creatori di PHP hanno fatto in questo modo?

Java era una lingua pianificata. È stato rigorosamente considerato e formalmente specificato sin dall'inizio. Era destinato a durare il più a lungo possibile con modifiche minime per motivi di compatibilità con le versioni precedenti e successive, per la semplicità sia per gli sviluppatori che per gli implementatori. Sicuramente non hanno avuto successo nella misura in cui speravano, ma puoi ancora prendere il codice Java 1.0, compilarlo ed eseguirlo su macchine virtuali moderne.

I progettisti di PHP non hanno mai pianificato il linguaggio a un livello così estremo. Lo fanno mentre vanno avanti. Nel bene o nel male, sono moderatamente disposti a gettare il linguaggio a parte e ricostruirlo nella prossima versione. E 'cambiato in modo ineccepibile da PHP 1 e 2. Anche recentemente, in PHP 5, hai avuto il drastico cambiamento dalla semantica per riferimento a oggetti di riferimento.È la stessa brillante metodologia che ci ha portato citazioni magiche, la mancanza di Unicode, le funzioni con nomi incoerenti (e spesso rinominate) e un parser che senza nemmeno un pizzico di errore (anche con error_reporting(-1);) interpreterà allegramente il letterale numericocome 0 .

Il comportamento di PHP può causare problemi quando non si rimuove il costruttore di args dalla classe padre, ad es. quando pensiamo che non è più necessario.

Si potrebbe richiedere questo essere modificato su bugs.php.net, ma è probabile che faranno ignorano o si fob via con "Ci dispiace, ma il vostro problema non implica un problema in PHP per sé ... ".

+2

+1, questa è l'unica risposta che risponde alla domanda. – Brad

1

Prima di PHP 5 il costruttore aveva lo stesso nome della classe, come JAVA. In PHP 5 una classe può avere un metodo di costruzione con lo stesso nome della classe (se non in uno spazio dei nomi) o con il nome di __construct. Forse ha qualcosa a che fare con quello.

4

Come abbiamo visto con lo 5.3.7 disaster, lo sviluppo di PHP potrebbe richiedere un po 'più di stabilità. Inoltre, PHP è diverso in molti altri modi.

  • Enterprise Backup non è nella stessa lega (non Oracle, non IBM, etc.)
  • PHP è vecchio, e talvolta incoerente
  • di interprete PHP (Zend Engine) deve essere in grado di fare terribilmente molto, sostenendo così tanti costrutti legacy e paradigmi di programmazione.
  • L'origine di PHP è un linguaggio di script semplice per gli hobbisti.

Mi piace molto PHP e lavoro quotidianamente, ma a volte è solo un piccolo capriccio. D'altra parte, se rimuovi __construct() ci sono due cose da considerare.

  1. Mai farlo, basta svuotare il costruttore
  2. Se si sta costruendo un quadro fanno init Funzioni di un concetto di base dal momento che queste sono anche le buone pratiche.

voglio dire questo:

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

La linea

parent::__construct(); 

è una chiamata esplicita al costruttore della classe genitore. "PHP" ti sta dando un errore perché non esiste.

si può effettivamente chiamare esplicitamente il costruttore inesistente di un genitore in Java e non un errore?

ricordare che il costruttore di una classe che estende una classe genitore sostituirà il costruttore della classe genitore quando la classe che si estende è costruito. Chiamare un costruttore genitore implica che ti aspetti che faccia qualcosa. Se il costruttore non esiste allora la tua chiamata ad esso non appartiene al codice se l'interprete ti dà un errore o meno.

+0

In Java non esiste una classe senza un costruttore - il compilatore ne aggiunge uno se non è scritto nel codice sorgente. Vedi https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9 – bdsl

Problemi correlati