Warum wird der Konstruktor aufgerufen, wenn die Klasse eine Methode (Funktion) mit ihrem Namen hat?

8

Warum gibt dieser Code "BD" wieder? Ich bin überrascht, nachdem ich das bekommen habe. Ich lerne OOP-Konzepte und neue erweiterte PHP.

%Vor%     
Mihir Vadalia 03.04.2015, 08:51
quelle

3 Antworten

6

Wenn Sie $d = new D(); aufrufen, wird der B -Konstruktor aufgerufen (weil D geerbt von C und C von B geerbt) und wenn Sie $d->a(); aufrufen, die Methode a() Ihrer Klasse D wird aufgerufen und print D , dann haben Sie als Ausgabe BD .

Wenn PHP 5 für eine gegebene Klasse keine __construct() -Funktion finden kann und die Klasse nicht von einer Elternklasse geerbt hat, sucht zur Rückwärtskompatibilität nach der alten Konstruktorfunktion Name der Klasse Effektiv bedeutet dies, dass der einzige Fall, der Kompatibilitätsprobleme hätte, wenn die Klasse eine Methode namens __construct() hätte, die für verschiedene Semantiken verwendet wurde.

In Ihrem Fall haben Ihre Klasse A und Ihre Klasse B einen Konstruktor

Lesemodus bei:

  

Ссылка

    
Adrian Cid Almaguer 03.04.2015, 08:55
quelle
6

Es gibt einen hässlichen Nebeneffekt. In einer früheren Version von PHP muss der Konstruktor der Klasse denselben Namen wie die Klasse selbst haben. Der Name unterscheidet nicht zwischen Groß- und Kleinschreibung . Bedeutung b ist der Konstruktor von B in Ihrem Fall. Da D ein Kind von B ist und D keinen eigenen Konstruktor einführt, wird der Konstruktor von B aufgerufen, der B in der Ausgabe auslöst.

In modernen Versionen von PHP sollte der Konstruktor __construct() heißen, um solche Probleme zu vermeiden. Sie können jedoch weiterhin den alten Mechanismus verwenden, aber es wird eine Benachrichtigung ausgelöst, wenn Ihre Fehlermeldungsstufe auf E_STRICT gesetzt ist.

    
hek2mgl 03.04.2015 08:59
quelle
1

Ссылка

Wenn die Methode genauso benannt wird wie die Klasse, wird sie als Konstruktor verwendet. Dies ist für die Rückwärtskompatibilität mit älteren PHP-Versionen.

    
Mantas 03.04.2015 08:57
quelle