サイトをphp化してXML宣言する方法、サイトが表示されなくなることの解決法

先日、とあるサイトをphpで作りました。

phpで作ると言っても、ただ単に拡張子を「.php」にして作るだけです。

こうすれば、phpのインクルードタグを使えるので、普通のウェブサイトでもMovable Type(MT)で作ったブログサイトのように、共通部分を外部化して読み込ませることができます。

たとえば、メニューとか。

僕はタグはすべて手打ちなので、100ページあるサイトのメニューを修正する場合、インクルードを使わなければ100ページ分のメニューを変更する必要があります。

この作業はほんとに辛いです・・途中で泣きたくなるほどです・・。

でも、phpのインクルードを使えば、外部化したファイルだけを修正すれば、すべてのページに反映されますから。

つまり、静的なHTMLサイトから動的なPHPサイトになるということですね。

でも、ウェブサイトをphp化するにあたり、1つの問題にぶち当たりました。

それが、XML宣言です。


XML宣言とは、HTMLファイルの先頭に書く記述のことです。

こんな風に書きます。

<?xml version="1.0" encoding="utf-8"?>

もとは、その文書がXML文書であることを明確に示す文字列ですが、XHTMLでサイト製作する際にも書くことが推奨されているというか、ないと文法チェックでツっこまれるので僕は入れるようにしています。

「xml version=”1.0″」がXMLのバージョン、「encoding=”utf-8″」が使用する文字コードです。

使用する文字コードが「Shift_JIS」の場合なら「encoding=”Shift_JIS”」となります。

XML宣言は、XHTMLファイルの文字コードが「utf-8」か「utf-16」以外で、かつWWWサーバーがcharsetパラメータで文字コードを送信しない場合には記述が必須となります。

僕の場合は、最近は次のような感じでサイトを作っています。

・とりあえず、XML宣言しとく
・文字コードは「utf-8」
・DOCTYPE宣言は「Strict DTD」

なので、HTMLファイルの出だしはこんな感じになります。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>

ただ、php化するとXML宣言の出だしの「<?」がひっかかってしまうようで、サイトが真っ白になります。

つまり、何も表示されないんです。ソースを見ても、何も書かれていません。真っ白です。

こんな感じで。

090909_1.gif

そこで、この現象を解決するために、XML宣言をHTMLファイルに直接書く形ではなく、phpで文字列を出力する形をとります。

PHPで文字列を出力すると、関数の「print」が思い浮かぶかもしれませんが、ここでは同じ動作をする「echo」を使います。

「print」と「echo」の違いの1つに、「値を返すかどうか」ということがあります。

「print」は値を返しますが、「echo」は値を返しません。その分、若干「echo」の方が速度が速いという声もあります。

まぁ、今回の場合では「print」を使おうが、「echo」を使おうが、速度の違いはほとんど認識できないでしょうが。。

「echo」を使ってXML宣言の文字列を書き出すには次のように書きます。

<?php echo '<?xml version="1.0" encoding="utf-8"?>' ?>

ただ、これだとXML宣言とDOCTYPE宣言が下記のようにHTMLソース上で改行されません。

090909_2.gif

まぁ、改行されなくても、別に問題ないのですが、次のように改行命令も書いておけばHTMLソース上でもちゃんと改行されます。

<?php echo '<?xml version="1.0" encoding="utf-8"?>'."\n" ?>

090909_3.gif

このように、XML宣言を直接HTMLファイルに書くのではなく、phpコマンドの「echo」を使って、XML宣言を文字列として書き出すようにすれば、サイトをphp化してXML宣言することができます。

Movable Type(MT)をPHP化してXML宣言する時も、この方法を使います。

あと、Macintoshを使っている人は、エディタによっては改行命令の「\(バックスラッシュ)」が入力できないかもしれません。

そんな時はJeditを使うといいですよ。

参考:
[PHP-users 1453] echo()とprint()の違いについて

“print”と”echo”の違いを教えてください – 教えて!goo