2013-02-13 123 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