PHP命名空间不起作用 - 怀疑PHP配置问题

时间:2013-02-13 21:19:40

标签: php apache namespaces synology

好的,所以,我一直在使用自动加载器,变得习惯于MVC,并决定尝试解决名称空间。嗯,这没有按预期工作。我设法以一种非常简单的方式重现错误,因此我的php文件的内容为:

<?php
namespace site\test;

echo 'hello';

输出不是我的预期:

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

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

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

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

PHP设置“auto_prepend_file”为空。

3 个答案:

答案 0 :(得分:2)

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

尝试在Linux上的vi编辑器中打开文件,它应该会显示开头是否有BOM。

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

答案 1 :(得分:1)

当您有一个UTF-8 BOM作为第一个字符的文件时,会发生这种情况,您应该删除开始标记之前的所有空格。

答案 2 :(得分:0)

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