0

我一直在摆弄 PHP 中的命名空间,并试图让它工作,但它失败了

让我展示示例代码:

测试\视图\类\MainController.php

<?php
namespace test\views\classes;

class MainController
{
    public function echoData()
    {
        echo 'ECHOD';
    }
}

测试\视图\index.php

<?php
require_once '..\autoloader\autoloader.php';

use test\views\classes\MainController;

$cont = new MainController();

$cont->echoData();

测试\自动装载机\自动装载机.php

<?php

spl_autoload_register(null, FALSE);

spl_autoload_extensions('.php');


function classLoader($class)
{
    $fileName = strtolower($class) . '.php';

    $file = 'classes/' . $fileName;

    if(!file_exists($file))
    {
        return FALSE;
    }

    include $file;
}

spl_autoload_register('classLoader');

引发错误:

Fatal error: Class 'test\views\classes\MainController' not found in ..\test\views\index.php on line 6

我错过了什么!

编辑:当 index.php 和 maincontroller.php 都在同一目录中而不使用自动加载器但使用 require_once('maincontroller.php'); 时,代码工作正常。如果它们位于不同的目录并具有自动加载功能,则不起作用。任何人都可以解决这个问题。

谢谢

4

2 回答 2

1

您的代码中存在多个问题:

命名空间分隔符 (\) 在 Linux/Unix 中不是有效的路径分隔符。你的自动加载器应该做这样的事情:

$classPath = str_replace('\\', '/', strtolower($class)) . '.php';
if (!@include_once($classPath)) {
 throw new Exception('Unable to find class ' .$class);
}

另外,路径都是相对的。您应该设置包含路径。如果你的网站结构是这样的:

bootstrap.php
lib/
  test/
    views/
      index.php
      classes/
        maincontroller.php
  autoloader/
    autoloader.php

您的 bootstrap.php 应该类似于:

$root = dirname(__FILE__);
$paths = array(
    ".",
    $root."/lib",
    get_include_path()
);
set_include_path(implode(PATH_SEPARATOR, $paths));
include 'lib/test/autoloader/autoloader.php';

现在,在您的 test/views/index.php 中,您可以只包含引导程序:

include '../../bootstrap.php';
于 2012-07-26T16:00:26.827 回答
0

向你的类加载器添加一个 die 语句:

$file = 'classes/' . $fileName;

die('File ' . $file . "\n");

你得到

File classes/test\views\classes\maincontroller.php

那真的是您的主控制器类所在的地方吗?

于 2012-07-26T20:28:14.870 回答