2011-06-30 10 views
1

すべて、コール()

私は、軽量PHPダイナミックフロントコントローラで次の記事読んでいます:ここでhttp://www.w3style.co.uk/a-lightweight-and-flexible-front-controller-for-php-5

はコードです:

のindex.php

<?php 

define("PAGE_DIR", dirname(__FILE__) . "/pages"); 
require_once "FrontController.php"; 
FrontController::createInstance()->dispatch(); 

FrontController.php

<?php 

class FrontController { 
    public static function createInstance() { 
    if (!defined("PAGE_DIR")) { 
     exit("Critical error: Cannot proceed without PAGE_DIR."); 
    } 
    $instance = new self(); 
    return $instance; 
    } 
    public function dispatch() { 
    $page = !empty($_GET["page"]) ? $_GET["page"] : "home"; 
    $action = !empty($_GET["action"]) ? $_GET["action"] : "index"; 
    //e.g. HomeActions 
    $class = ucfirst($page) . "Actions"; 
    //e.g. pages/home/HomeActions.php 
    $file = PAGE_DIR . "/" . $page . "/" . $class . ".php"; 
    if (!is_file($file)) { 
     exit("Page not found"); 
    } 
    require_once $file; 
    $actionMethod = "do" . ucfirst($action); 

    $controller = new $class(); // I DON'T UNDERSTAND WHAT THIS DOES... 

    if (!method_exists($controller, $actionMethod)) { 
     exit("Page not found"); 
    } 
    //e.g. $controller->doIndex(); 
    $controller->$actionMethod(); 
    exit(0); 
    } 
} 

ページ/ゲストブック/ GuestbookActions.phpフロントコントローラクラスで

<?php 

class GuestbookActions { 
    public function doIndex() { 
    echo "Index action called..."; 
    } 
    public function doCreatePost() { 
    echo "CreatePost action called..."; 
    } 
} 

、誰かが$controller = new $class();が何を私に説明できますか?私はそれを理解していない。それは、オンザフライでクラスを作成しているようですか?上記の例では、$classは、"HomeActions"のような値を持つ文字列です。だから$controller"HomeActions"というクラスの新しいインスタンスになりますが、それらはどこにも定義されていません。よくわかりません。

多くのおかげで、

JDelage

答えて

2
$controller = new $class(); 
実際 $classに含まれているタイプの新しいオブジェクトを作成しない

、それはあなたの例では$controller = new HomeActions()に相当します。 the manualから:

クラスの名前を含む文字列が新しいで使用されている場合は、そのクラスの新しいインスタンスが

作成されたクラスは、最初はすべて存在していません。しかし、必要なものは、動的にロードされます。上記のようにオブジェクトを作成できるように

$file = PAGE_DIR . "/" . $page . "/" . $class . ".php"; 
if (!is_file($file)) { 
    exit("Page not found"); 
} 
require_once $file; 

require_onceは、おそらくクラス定義を含むファイルをロードします。

+0

皆さんありがとうございます - ありがとう! – JDelage