My routing.php(自动准备文件)
<?php
if (preg_match('/'.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {
return false;
} else {
include 'index.php';
}
我的index.php
<?php
namespace MVC;
require_once "controllers/AdminController.php";
use MVC'controllers'AdminController as AdminController;
/*
* Break the requested URI down into an array
*/
$request = trim($_SERVER["REQUEST_URI"]);
$request = explode("/", $request);
$request = array_filter($request);
$additional = array();
$singles = array();
/*
* Get the method/controller from the requested URL
*/
foreach($request as $key=>$item) {
switch($key) {
case 1:
$controller = $item;
break;
case 2:
$method = $item;
break;
default:
if($key > 2) {
$item = explode("=", $item);
if(isset($item[1])) {
//key item pair, data
$pairs[$item[0]] = $item[1];
/*
* Make the assumption that any value passed in
* as an assigned value is data and not a route
*
* Append this to the pairs array as its own key/item
*/
} else if(isset($item[0])) {
echo "<b>WARNING: '"" . $item[0] . "'" has no key/value!</b>";
}
}
break;
}
}
/*
* Handle the fact that these might not have been requested
*/
if(!isset($controller))
$controller = 'index';
$controller = ucfirst($controller) . "Controller";
if(!isset($method))
$method = 'index';
$controller = new $controller();
我的AdminController.php(在controllers/AdminControllerphp中找到)
<?php
namespace MVC'controllers;
require_once "libs/Controller.php";
use MVC'libs'Controller;
class AdminController extends Controller {
}
最后在libs/Controller.php 中找到了我的Controller超类
<?php
namespace MVC'libs;
class Controller {
}
我的问题是这条线
$controller = new $controller();
我知道这是一个变量——这就是我的意图,我试图根据URI请求动态加载这个类。
出现以下错误:
127.0.0.1:50342 [500]: /admin/users/id=555/action=ban - Class 'AdminController' not found in /home/jack/PhpstormProjects/mvc/index.php on line 64
我已经检查过它是否需要该类,并将其用作"AdminController",但它仍然无法在相关的命名空间中找到对它的引用——我想,因为它是动态的,所以可能会有一些问题?
干杯!
编辑:我的文件夹结构
controllers
AdminController.php
libs
Controller.php
index.php
routing.php
这是一个命名空间问题。不能像您那样同时使用变量类名和use
语句。您的变量在运行时获取其值,而use
导入在编译时完成(由于同样的原因,use
不能在块范围内使用)。参见:
use foo as bar;
class foo {
public function __construct() {
echo "OK'n";
}
}
new foo(); // OK
new bar(); // OK
$foo = 'foo';
$bar = 'bar';
new $foo(); // OK
new $bar(); // Fatal error: Class 'bar' not found
解决方案:在变量中使用完整的类名(带绝对命名空间)。