2013-02-13 113 views
1

好的,所以,我一直在使用自动加载器一段时间,变得相当习惯于MVC,并决定尝试解决命名空间。那么,这没有按预期工作。我已成功地重现错误在一个非常简单的方法,让我的PHP文件的内容如下:PHP命名空间不工作 - 怀疑PHP配置问题

<?php 
namespace site\test; 

echo 'hello'; 

输出是不是我所期待的:

致命错误:命名空间声明语句必须是文件第2行中的第一条语句

我在Synology NAS上使用最新版本的DSM(Synology的操作系统)运行PHP 5.3.10。这使用了Apache v2.2.22。我可以确认,注释掉“命名空间”行后面会返回单词“hello”,在它之前没有多余的字符。

文件开头没有BOM。我也没有设置标题的问题,如“位置”,这表明这是一个问题。

行尾是Unix(仅限\ n),文件的字符编码是UTF8。

PHP设置“auto_prepend_file”为空。

+0

这同样适用于使用命名空间的第三方文件,还是仅适用于您创建的文件? – 2013-02-13 21:49:40

+0

@ dev-null-dweller - 使用命名空间的所有文件。 – SEoF 2013-02-13 22:12:29

回答

0

重新安装DSM(Synology操作系统)实际上解决了这个问题。一旦完成,从其他框架获得的一些类在文件开头有“BOM”字节,但不是全部。 BOM问题的简单解决方案是将“BOM”卸妆器添加到自动装载机中。

2

在命名空间之前是否有任何空格?命名空间必须出现在任何输出之前。这包括浏览器的HTML。这还包括一个UTF-8字节顺序标记(BOM),它可以从某些编辑器中读入。

尝试在Linux上的编辑器(如vi)上打开该文件,它应该会显示是否在开始时有BOM。

检查How to fix "Headers already sent" error in PHP了解有关输出可以在文件中启动的其他方式的信息。

+0

我查过了,开头没有BOM。我也没有设置标题,如“位置:”,它们在设置之前不需要空白空间。 – SEoF 2013-02-13 21:25:09

+0

你确定你没有设置标题的问题吗?也许你的服务器没有显示警告,只显示致命错误(哪些命名空间声明是)。如果你没有输出,没有BOM,你可以真正执行一个重定向头(浏览器实际重定向)......然后我迷路了。 – 2013-02-13 21:26:28

+0

@SEoF检查你的行结尾,确保它们不是窗口行尾。有输出从*某处*,否则你不会有这个错误。 – 2013-02-13 21:28:58

1

如果您的文件的第一个字符是UTF-8 BOM,并且您应该在开始标记前删除所有空格,则会发生这种情况。

+0

我检查过了,开始时没有BOM。我也没有设置标题,如“位置:”,它们在设置之前不需要空白空间。 – SEoF 2013-02-13 21:27:03