我让spl_autoload_register工作正常,但后来我决定添加一些命名空间以引入PSR2合规性并且似乎无法使其正常工作。
目录结构:
-index.php
-classes/
-Class1.class.php
-Class2.class.php
-Class3.class.php
每节课都以:
开头namespace Foo;
Class ClassX {
的index.php:
<?php
spl_autoload_register(function($class) {
include 'classes/' . $class . '.class.php';
});
$myObj = new Class1();
echo $myObj->doSomething();
此产品错误Fatal error: Class 'Class1' not found in /var/www/myApp/index.php on line X
我的第一个想法是我需要在我的实例化中使用命名空间,所以我将index.php
更改为:
$myObj = new Foo\Class1();
然而,我得到了
Warning: include(classes/Foo\Class1.class.php): failed to open stream: No such file or directory in /var/www/myApp/index.php on line 6
如果我手动包含一切正常,include 'classes/Class1.class.php';
等等。
答案 0 :(得分:13)
所以问题是返回$class
的{{1}}是名称空间\类名, 反斜杠完好无损。所以当我实例化一个新对象时:
spl_autoload_register
包含路径变为$myObj = new Foo\Class1();
,反斜杠打破了路径。
我实现了这个来修复反斜杠,它现在有效,虽然我不知道为什么这是必要的。
/var/www/myApp/classes/Foo\Class1.php
答案 1 :(得分:3)
尝试在路径前使用 DIR 常量,例如:
spl_autoload_register(function($class) {
include __DIR__.'/classes/' . $class . '.class.php';
});
它将确保相对路径始终相同。
你必须使用&#34;正确&#34;文件夹结构:
myproject/
-loader.php
-class/
-- Namespace1/
--- Class1.class.php
--- Class2.class.php
-- Namespace2/
--- Class3.class.php