关于Ubuntu autoload_register和命名空间问题的PHP

时间:2012-12-10 16:14:10

标签: php ubuntu namespaces spl-autoload-register

我这里有问题。我已经为所有类创建了命名空间。以前我使用Windows 7开发当前的应用程序,一切都很好。现在我刚搬到ubuntu,问题来了。

的index.php

spl_autoload_extensions(".php");
/*spl_autoload_register(function ($class) {
    require __DIR__ . '/../' . $class . '.php';
});*/
//provided i have tried the above method, which works on windows 7 but not Ubuntu
spl_autoload_register(function ($class) {
    require '/../' . $class . '.php';
});

//for your info, i do this
//require "../resources/library/Config.php";
//it works, no error

use resources\library as LIB;
use resources\dal as DAL;

//instantiation
$config = new LIB\Config();
print_r($config->fbKey());

我收到了这个错误

PHP Warning:  require(../resources\\library\\Config.php): failed to open stream: No such file or directory in /home/user/dir1/dir2/index.php

我找不到错误。希望你们能帮助我。任何问题都会毫不犹豫地发表评论我会编辑。提前谢谢。

更新 - 额外信息

PHP版本5.4.6

最新更新

任何想法如何在不使用str_replace的情况下解决这个问题? JULP和MOONWAVE有答案!

3 个答案:

答案 0 :(得分:1)

你的目录分隔符有问题,因为它在Win和Unix中有所不同。

为了保持一致,您应该更新自动加载功能:

spl_autoload_register(function ($class) {
    require '/../' . str_replace("\\", DIRECTORY_SEPARATOR, $class) . '.php';
});

编辑:生产环境中的解决方案是pretty wide accepted

答案 1 :(得分:0)

您使用的是哪个PHP版本? (在PHP< 5.3.3中,默认的spl_autoload_register不支持名称空间 - 我的意思是\在Unix系统上没有被/取代)

在您的代码中,尝试替换:

require __DIR__ . '/../' . $class . '.php';

人:

require __DIR__ . '/../' . str_replace('\\', '/', $class) . '.php';

=>总是在路径中使用斜杠,它们随处可见。反斜杠,不要。不要忘记,在Unix系统上,文件名区分大小写,与Windows相反。

答案 2 :(得分:0)

如果您要进行跨平台开发,您应该熟悉PHP的DIRECTORY_SEPARATOR常量的使用。

那里的错误信息应该告诉你所有你需要知道的事情。您没有生成正确的LINUX文件路径。