开发者

Call to undefined $class() in w3style blog article on PHP dynamic front controllers

All,

I am reading the following article on a lightweight PHP dynamic front controller: http://www.w3style.co.uk/a-lightweight-and-flexible-front-controller-for-php-5

Here is the code:

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 T开发者_开发技巧HIS DOES...  

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

pages/guestbook/GuestbookActions.php

<?php

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

In the front controller class, could someone explain to me what $controller = new $class(); does? I don't understand it. It seems to be creating a class on the fly? In the example above, $class is a string with a value like "HomeActions". So $controller would be a new instance of a class named "HomeActions", but those are not defined anywhere. I'm confused.

Many thanks,

JDelage


$controller = new $class();

That does indeed create a new object of the type contained in $class, so it is equivalent to $controller = new HomeActions() in your example. From the manual:

If a string containing the name of a class is used with new, a new instance of that class will be created

The classes are not all present initially. However, the necessary one is loaded dynamically:

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

require_once loads the file which presumably contains the class definition, so you can create the object as shown above.


The example request in the article is to http://localhost/index.php?page=guestbook&action=index, so $class would be GuestbookActions, which is defined in the third code sample.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜