XHTML で PHP を利用しようとすると 1 行目で構文エラーが検出される
SPECIAL
PHP ファイルの 1 行目で構文エラーが検出される
XHTML 形式の Web ページ内で PHP スクリプトを使用するために、ファイルの拡張子を PHP にしたところ、ページが真っ白のまま何も表示されなくなってしまいました。
その時、Web サーバー Apache のログファイルを確認すると、次のようなエラーが記録されていました。
PHP Parse error: syntax error, unexpected T_STRING in /home/site/public_html/index.php on line 1
このようなログがあった場合、末尾の "line 1" という箇所が重要で、たいていの場合 XHTML の冒頭に書かなければならない冒頭の行が、PHP スクリプトとして処理されてしまうために起こることが原因の様子です。
<?xml version="1.0" encoding="UTF-8"?>
XHTML の場合、冒頭は上のような行から始まることになりますけど、ファイルの拡張子を "php" としたときに、この中の最初に現れる "<?" が、PHP スクリプトの開始タグと誤認されてしまうため、エラーと検出されてしまっている場合が多いようです。
これをエラーとして誤認されないようにするには、二つの方法があるようです。
ひとつは、"<?" タグを PHP として認識させないように PHP の設定を調整する方法です。PHP は標準で "<?php" というタグで PHP スクリプトを埋め込めるようになっているので、こちらだけを使用するように設定することで、"<?xml" を、XHTML の情報として認識させるというものです。
もうひとつは、PHP スクリプトを使って XHTML に必要な "<?xml" タグを出力するという方法です。
どちらが良いかは考え方やサーバーの状況にもよるとは思いますが、個人的には PHP の設定調整が可能なら、XHTML を使用する場合は "<?" を PHP 開始タグにしないように設定するのが自然なように感じます。
対応方法1: PHP のショートオープンタグを無効にする
PHP の設定を調整することで、PHP の開始タグとして短い形式 "<?" を使用できないようにすることができます。
PHP の設定ファイル (/etc/php.ini) を編集して、"engine = On" の下あたりに次の設定行を記述します。
short_open_tag = Off
"short_open_tag" の設定が既に記述されている場合もあるので、存在している場合はその値が Off であることを確認します。
設定を調整したら、Apache の設定を再読み込みすることで設定が有効になります。たとえば CentOS 5.4 の場合は、次のようにして Apache の再読み込みを行うことが可能です。
service httpd reload
このようにすることで、PHP の開始タグは "<?php" しか許されなくなるため、XHTML で使用する "<?xml" が PHP 開始タグと誤認されずに済み、ページが正しく表示されるようになります。
対応方法2: PHP スクリプトを用いて XHTML 用のタグを出力する
PHP スクリプトを用いて XHTML 用のタグを出力することで、この問題を解消することもできるようです。
その場合、PHP スクリプトを埋め込む XHTML ファイルの冒頭では、必ず次のスクリプトを実行させるようにします。
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
このようにすることで、PHP スクリプト実行時に PHP が XHTML 用のタグを出力してくれるため、正しい形でページを表示することが可能になります。