PHP命名空间和spl_autoload_register

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)

  • 好吧,我放弃了,没有什么比这个答案更好的了。 (2认同)