我一直在使用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();
测试\自动装载机\ autoloader.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')的同一目录中时,代码工作正常; 如果它们位于不同的目录中并且具有自动加载器功能,则不起作用。任何人都可以解决这个问题。
由于
答案 0 :(得分: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';
答案 1 :(得分:0)
将die语句添加到类加载器:
$file = 'classes/' . $fileName;
die('File ' . $file . "\n");
你得到了
File classes/test\views\classes\maincontroller.php
这真的是您的主控制器类所在的位置吗?