命名空间自动加载在 Windows 下有效,但在 Linux 上无效
我有以下 php 代码:
index.php
<?php
spl_autoload_extensions(".php");
spl_autoload_register();
use modules\standard as std;
$handler = new std\handler();
$handler->delegate();
?>
modules\standard\handler.php
<?php
namespace modules\standard {
class handler {
function delegate(){
echo 'Hello from delegation!';
}
}
}
?>
在 Windows 7 下,运行 WAMP,代码会生成消息“Hello from Delegation!”但是在Linux下,我得到以下信息:
致命错误:spl_autoload():无法在第 15 行 /var/www/index.php 中加载类模块\standard\handler
Windows 在 WAMP 下运行 PHP 5.3.0,Linux 在 WAMP 下运行 5.3.2 dotdeb 包乌班图9.10。
这是我的 Linux 机器上的配置问题,还是只是不同操作系统上处理命名空间和自动加载的方式不同
I have the following php code:
index.php
<?php
spl_autoload_extensions(".php");
spl_autoload_register();
use modules\standard as std;
$handler = new std\handler();
$handler->delegate();
?>
modules\standard\handler.php
<?php
namespace modules\standard {
class handler {
function delegate(){
echo 'Hello from delegation!';
}
}
}
?>
Under Windows 7, running WAMP, the code produces the message "Hello from Delegation!" however under Linux, I get the following:
Fatal error: spl_autoload(): Class modules\standard\handler could not be loaded in /var/www/index.php on line 15
Windows is running PHP 5.3.0 under WAMP, and Linux is running the 5.3.2 dotdeb package under Ubuntu 9.10.
Is this a configuration issue on my linux box, or just a difference in the way namespaces and autoloading is handled on the different operating systems
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
SPL 自动加载器非常原始 - 它不知道名称空间,因此它尝试加载名称中包含 \ 的文件,而在 Linux/Unix 上路径分隔符是 / 不是。
The SPL autoloader is extremely primitive - it has no knowledge of namespaces, so it tries to load a file with \ in it's name while on Linux/Unix the path separator is / not .
Herman Radtke 表示他已提交补丁:
http:// www.hermanradtke.com/blog/hidden-features-with-spl_autoload-and-namespaces/
:
我希望它很快就能实现。
现在我使用这个解决方法:
Herman Radtke says he has submitted a patch :
http://www.hermanradtke.com/blog/hidden-features-with-spl_autoload-and-namespaces/
:s
I'm hoping it'll be implemented soon.
For now I use this workaround :
Apache 需要
srttolower
,因为它区分大小写(与 IIS 不同)。The
srttolower
is needed on Apache because it is (contrary to IIS) case sentive.这是自动加载时常见的问题。修复方法是在自动加载函数中使用 DIRECTORY_SEPARATOR 常量。
因此,您的自动加载函数将如下所示
如果您需要了解有关命名空间/类自动加载的更多信息,请访问 在这里
谢谢。
This is a common problem occurs when autoloading. The fix is to use DIRECTORY_SEPARATOR constant in the autoload function.
So your autoload function will look like following
If you need to learn more on namespace/class autoloading visit here
Thanks.