0

これは簡単なはずです..誰かが私のために構文を説明できますか?

構成クラスをインスタンス化するブートストラップ クラス (新しいキーワード) をインスタンス化するコントローラーがあります。

次に、コントローラーは、ブートストラップ クラスを拡張する開始ページ クラスをインスタンス化します。startpage クラスで、ブートストラップ (親) クラスの構成オブジェクトにアクセスしようとしています。

これもできますか?または、startpage はブートストラップを直接インスタンス化する必要がありますか? ブートストラップを拡張する開始ページをインスタンス化すると、ブートストラップが上書きされますか? それとも私の構文が間違っていますか?

コントローラー(インデックスページ)

try {
    if (!include($paths['root'] . $paths['framework'] . '/core/AutoLoader.php')) {
        throw new Exception ('<b>Error - AutoLoader is missing</b>');
    }
    $loader   = new AutoLoader($paths);
    $appStack = new BootStrap($paths);
    $app      = new StartPage();
    $app->start();
} catch (Exception $e) {
    echo
        '<p><b>EXCEPTION</b><br />Message: '
        . $e->getMessage()
        . '<br />File: '
        . $e->getFile()
        . '<br />Line: '
        . $e->getLine()
        . '</p>';
}

ブートストラップ クラス:

class BootStrap {
    protected $config;

    /**
     * --------------------------------------------------------------------------
     ** GETTERS
     * --------------------------------------------------------------------------
     *
     */
    public function getConfig() { return $this->config; }

    /**
     * --------------------------------------------------------------------------
     * __construct()
     * PUBLIC method
     * = Starts a new session, loads stylesheets, loads classes
     * --------------------------------------------------------------------------
     *
     */
    public function __construct($paths) {

        /**
         * --------------------------------------------------------------------------
         * load Config class
         * --------------------------------------------------------------------------
         *
         */
        try {
            if (!class_exists('Config')) {
                throw new Exception ('<b>Error - Configuration class is missing</b>');
            }
            $this->config      = new Config();
        } catch (Exception $e) {
            echo
                '<p><b>EXCEPTION</b><br />Message: '
                . $e->getMessage()
                . '<br />File: '
                . $e->getFile()
                . '<br />Line: '
                . $e->getLine()
                . '</p>';
        }
    }
}

開始ページ クラス:

class StartPage extends BootStrap {

    /**
     * --------------------------------------------------------------------------
     * __construct()
     * PUBLIC method
     * = Starts a new session, loads stylesheets, loads classes
     * --------------------------------------------------------------------------
     *
     */
    public function __construct() {
    }

    /**
     * --------------------------------------------------------------------------
     * Start()
     * PUBLIC method
     * = loads the web page
     * --------------------------------------------------------------------------
     *
     */
    public function Start() {

        // path to includes
        $inc_path = $this->paths['root'] . $this->paths['medium'];

        // instantiate page, html header
        $charset     = $this->config->getCharset();
        $title       = $this->config->getTitle();
        $description = $this->config->getDescription();
    }
}
4

3 に答える 3

2

StartPage独自のメソッドを指定するとすぐに、その__construct()メソッドを効果的に「非表示」にしてBootstrap、完全にオーバーライドします。したがって、クラスからのコード$foo = new StartPage() のみを実行します。__construct()StartPage

親クラスでも__construct()コードを実行するには、を使用して明示的な呼び出しを追加する必要があります。Bootstrapparent::__construct()

PHPがこれを行わない理由がわからない場合は、自動の場合に実行できなかった3つのことを次に示します。

  1. を呼び出すタイミングを選択して、親コンストラクターの前後の両方でコードを実行します。parent::__construct()
  2. クラスの残りの部分を継承しながら、コンストラクターロジック全体を別のものに置き換えます。
  3. 常に同じである値を親コンストラクターに渡します/子クラスによって自動的に選択できますが、親クラスに明示的に提供する必要があります。

編集:以下の詳細を要約すると、親()クラスの特定のインスタンスを作成しても、同じクラスまたはその子クラス( )Bootstrapの他のインスタンスを後で作成しても違いはありません。StartPageそれぞれが個別のオブジェクトであり、__construct独立して呼び出します。

StartPage複数のオブジェクトがクラスの1つの特定のインスタンスを参照するようにしたい場合Bootstrap、継承は適切なメカニズムではありません。代わりに、作成したインスタンスを何らかの形の依存性注入を介しBootstrapて各インスタンスに渡す必要があります。StartPage

于 2013-01-14T00:13:21.120 に答える
0

子クラスのコンストラクターを実装して、親のコンストラクターを明示的に呼び出してみてください。

public function __construct() {
    parent::__construct();
}
于 2013-01-14T00:11:04.450 に答える
0

スタートページで:

protected $config;

public function __construct() 
{
   $this->config = $this->getConfig();
}

または、xelberの回答に従って、使用しますparent::__construct();

于 2013-01-14T00:13:08.253 に答える