2010-08-12 19 views
11

Ho iniziato da poco php e mi chiedevo le differenze tra __construct() e un metodo con lo stesso nome della classe?__construct() vs metodo con lo stesso nome della classe

C'è un motivo per usarlo? Tutto quello che riesco a capire è che ignora il metodo chiamato Foo o è giù al quale preferisci?

E.g.

class Foo { 

    function Foo() 
    { 
     echo 'Foo stated<br>'; 
    } 

    function __construct() { 
     echo 'Construct started<br>'; 
    } 
} 

Grazie

+0

Possibile duplicato di [\ _ \ _ construct() vs SameAsClassName() per il costruttore in PHP] (http://stackoverflow.com/questions/217618/construct-vs-sameasclassname-for-constructor-in-php) – nawfal

risposta

3

Foo() è un modo PHP4 (sconsigliato), __construct() è il modo php5. php prima cercherà __construct, quindi, se non viene trovato, userà Foo

+0

Grazie mille. – Joe

7

"se PHP 5 non riesce a trovare una funzione __construct() per una determinata classe, cercherà la funzione di costruzione vecchio stile, il nome della classe. In effetti, significa che l'unico caso che avrebbe problemi di compatibilità è se la classe avesse un metodo chiamato __construct() che è stato usato per semantica diversa. "

Fonte:http://www.php.net/manual/en/language.oop5.decon.php

8

Utilizzando __construct() è il più recente PHP5 più OOP focalizzata metodo da chiamare un costruttore. L'utilizzo di un metodo con lo stesso nome della classe è il vecchio modo deprecato di farlo e non funzionerà come costruttore a partire da PHP 5.3.3 per le classi con nomi assegnati.

Da the constructors and destructors page:

Per la compatibilità all'indietro, se PHP 5 non riesce a trovare una funzione __construct() per una data classe, cercherà per la funzione di costruzione vecchio stile, dal nome della classe. In effetti, significa che l'unico caso che avrebbe problemi di compatibilità è se la classe avesse un metodo chiamato __construct() che è stato usato per semantica diversa.

Diversamente da altri metodi, PHP non genererà un messaggio di errore di livello E_STRICT quando __construct() viene sovrascritto con parametri diversi rispetto al metodo __construct() principale.

A partire da PHP 5.3.3, i metodi con lo stesso nome dell'ultimo elemento di un nome di classe con spazio dei nomi non verranno più considerati come costruttore. Questa modifica non ha effetto sulle classi non assegnate ai nomi.

0

Avere un metodo con lo stesso nome della classe, che si chiama automaticamente come costruttore è un ritorno ai PHP4, e deve essere considerato deprecato ... nella più recente ramo di sviluppo di PHP, lo farà essere trattati come un normale metodo di classe. __construct è il costruttore formalmente accettato in PHP5, anche se nelle versioni attuali tornerà al metodo PHP4 se __construct non esiste.

3

C'è un motivo per usarlo? Tutto ciò che I è in grado di risolvere sostituisce il metodo denominato Foo o è in basso a che preferisci?

I vantaggi di __construct() diventano più chiari quando si intende ridenominare ed ereditare. Se si rinomina una classe, è necessario rinominare il costruttore.Nessun grosso problema, ma se la classe B eredita dalla classe A si potrebbe finire con:

class B extends A { 
    function B() { 
     parent::A(); 
    } 
} 

E 'molto più facile e più gestibile di fare:

function __construct() { 
    parent::__construct(); 
} 

Ora, quando si rinomina la classe A, è don Bisogna ricordare di cambiare anche le chiamate genitore in tutti i suoi figli. Certo, c'è ancora il nome da fare nel tuo codice, ma almeno questo non è uno di questi.

Problemi correlati