1

私は次のクラスを持っています

 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 のインスタンスを 2 つ取得するため、クラス関数が 2 回呼び出されています。奇妙なことに、別のコンテナー クラスがあり、コンストラクターで init() も呼び出しますが、それは 1 回しか呼び出されません。

私は何が欠けていますか?コンストラクターから init() を削除すると、何らかの方法で init() が呼び出され、すべて正常に動作します。

ありがとう

4

1 に答える 1

2

からinit()呼び出されるparent::__construct(..)ため、子コンストラクターから呼び出す必要はありません。init()クラスが作成されると、PHP は正しいメソッドを呼び出します。

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
于 2013-06-24T23:24:51.493 に答える