PHP命名空间和spl_autoload_register

时间:2014-03-19 02:21:41

标签: php namespaces autoload spl-autoload-register

我让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';等等。

2 个答案:

答案 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