dip*_*rus 8 php namespaces autoload spl-autoload-register
我让spl_autoload_register工作正常,但后来我决定添加一些命名空间来引入PSR2,并且似乎无法使其正常工作.
目录结构:
-index.php
-classes/
-Class1.class.php
-Class2.class.php
-Class3.class.php
Run Code Online (Sandbox Code Playgroud)
每节课都以:
namespace Foo;
Class ClassX {
Run Code Online (Sandbox Code Playgroud)
index.php文件:
<?php
spl_autoload_register(function($class) {
include 'classes/' . $class . '.class.php';
});
$myObj = new Class1();
echo $myObj->doSomething();
Run Code Online (Sandbox Code Playgroud)
这个产品出错了 Fatal error: Class 'Class1' not found in /var/www/myApp/index.php on line X
我的第一个想法是我需要在我的实例化中使用命名空间,所以我改为index.php:
$myObj = new Foo\Class1();
Run Code Online (Sandbox Code Playgroud)
但是,我得到了
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';等等.
dip*_*rus 13
所以问题是,$class回到幸福spl_autoload_register是命名空间\类名,用反斜杠完好.所以当我实例化一个新对象时:
$myObj = new Foo\Class1();
Run Code Online (Sandbox Code Playgroud)
包含路径变为/var/www/myApp/classes/Foo\Class1.php,反斜杠打破了路径.
我实现了这个来修复反斜杠,它现在有效,虽然我不知道为什么这是必要的.
spl_autoload_register(function($class) {
include 'classes/' . str_replace('\\', '/', $class) . '.class.php';
});
Run Code Online (Sandbox Code Playgroud)