找不到动态类引用PHP


Cannot find dynamic class reference PHP

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

解决方案:在变量中使用完整的类名(带绝对命名空间)。