好的,所以,我一直在使用自动加载器,变得习惯于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”为空。
答案 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”移除器。