PHP init被调用两次?

时间:2013-06-24 21:55:45

标签: php class zend-framework

我有以下课程

 class CLG_Container_Main_Schedule extends CLG_Container_Main
 {
     protected $_box = 'schedule';

     public function __construct($calendar=null)
     {
         parent::__construct($this->_box);
         $this->init();
     }


     public function init()
     {  
         $this->setTitle('Schedule');

         $html = '<div id="schedule_time">';
         for( $h = 5; $h < 24; $h++ )
         {
             for( $m=0; $m <60; $m += 15 )
             {
                 $time = str_pad($h, 2, '0', STR_PAD_LEFT) . ':' . str_pad($m, 2, '0', STR_PAD_RIGHT);
                 $time_id = str_pad($h, 2, '0', STR_PAD_LEFT) . str_pad($m, 2, '0', STR_PAD_RIGHT);
                 $html .= '<div class="schedule_time" time="' . $time_id . '">' . $time . '</div>';
             }
         }
         $html .= '</div>';
         $this->setContent($html);
     }


     public function render()
     {
         return parent::render();
     }
 }

由于某种原因,类函数被调用两次,因为我得到了两个我正在创建的$ html实例。奇怪的是我有另一个容器类,它也在构造函数中调用init(),但只调用一次。

我错过了什么?当我从构造函数中删除init()时,会调用init(),并且一切正常。

由于

1 个答案:

答案 0 :(得分:2)

init()调用parent::__construct(..)后,您不需要从子构造函数中调用它。在创建类时,PHP将调用正确的init()方法。

当您从子课程中删除对init的调用并且一切按预期工作时,您已经验证了这一点。

您可以通过运行这个简单的示例来验证这一点,该示例或多或少地反映了您的代码中发生的事情。

<?php

class AParent {
    public function __construct() {
        $this->init();
    }

    public function init() {
        echo "init parent\n";   
    }
}


class AChild extends AParent {

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

    public function init(){
        echo "init child\n" ;
    }
}

new AParent(); // Calls init from AParent
new AChild(); // Calls init from AChild