2009-04-10 4 views
0

Si j'ai cette classe:Le constructeur de Superclass s'exécute-t-il dans le constructeur enfant en PHP?

<?php 
class Model 
{ 
    var $db; 

    function Model() 
    { 
     $this->db=new Db_Class(); 
    } 
} 
?> 

et une deuxième classe qui a étendu la classe parente:

<?php 
class LessonModel extends Model 
{ 

    public function LessonModel() 
    { 
     //code here 
    } 

    public function getTitle($id) 
    { 
     $this->db->setTable('myTable'); 
     return $this->db->get('title',$id); 
    } 
} 
?> 

Est-il sûr de supposer que le champ $LessonModel->db aurait été instancié par la société mère Model classe de constructeur, ou dois-je l'exécuter manuellement en utilisant quelque chose comme parent::Model();?

Répondre

10

Vous ne pouvez pas supposer que le constructeur parent a été appelé parce que vous l'avez remplacé dans votre sous-classe. Vous devez appeler parent::Model() comme vous le suggérez. Si vous changez la classe dont vous héritez, vous devrez évidemment changer cela. Si vous utilisez PHP5 alors vous pouvez nommer vos constructeurs __construct(). Cela a l'avantage de vous permettre d'appeler facilement un constructeur parent en faisant parent::__construct() dans n'importe quelle classe dérivée sans spécifier le nom de classe parent. Vous pouvez ensuite réorganiser l'héritage de vos classes avec moins de tracas et moins de risques d'introduire des bogues obscurs.

0

Dans l'exemple donné, vous pouvez supposer que.

Cependant, si votre classe enfant définit un constructeur, PHP ne l'appellera pas implicitement comme constructeur parent.

Pour ce faire, appelez:

parent::__construct(); 
+1

Sa classe enfant a défini un constructeur en utilisant l'ancienne convention de nommage Classname() –

+1

Sérieusement, plus je programme PHP, plus je le déteste! Que se passe-t-il! J'ai presque la même structure de classe que l'exemple donné. J'utilise le code pour la connexion à la base de données. D'après ce que j'ai vu ici, je dois initialiser une nouvelle connexion chaque fois que j'ai besoin de faire une requête?! Je commence à penser totalement à Java! @Click Upvote Ouais ...: / – tftd

0

Il y a un moyen pas cher pour se déplacer d'avoir à appeler le constructeur parent.

Créez une méthode init() vide dans la classe de base. Appelez $ this-> init() dans le constructeur de la classe de base.

Toutes les sous-classes peuvent implémenter init() si elles veulent exécuter du code lors de la création de la classe.

Questions connexes