namespace と utf-8 の微妙な関係

php5.3になって 名前空間が利用できるようになったのですが、
namespace キーワードの前には declare 文以外を置いてはいけない
という決まりがあります。
( http://www.php.net/manual/ja/language.namespaces.definition.php )

ところが、namespace の前には <?php しか置いてないはずなのに、

Fatal error: Namespace declaration statement has to be the very first statement in the script

となって実行できないケースに遭遇しました。


原因は BOM でした。


utf-8 には BOM と呼ばれる unicode であることを示す(かつエンディアンを表す)値が付くことがあります。

これ、通常のエディタでは表示されないので付いているのかどうか見た目にわかりません。

また、phpはこれを無視してくれないため<?php の前にデータがあると見なされ、エラーとなったようです。
(php5.3/5.3.1 で確認)

phpソースコードutf-8 で保存する場合は、BOM をつけないよう注意。