このタイトルなんだかかっこいいよね。そんなことを意図して決めた訳ではないのですが。
名前に似合わず?コーディングネタ。
今回はWordPressは置いといて、PHPだけの話。
得てしてマニュアルと言うものは不親切ではありますが…。
いや決してマニュアルを責めている訳でもないのです。
大変お世話になっとります。
しかしぱっとよんで「そう言う理解はせんよ」と思う文章はあります。
PHPでは、他のテキストの間に、コードを埋め込むことが出来ます。こんな感じで。
<html> <body> <h3>ページタイトル</h3> <?php echo 'test'; ?> あああああ<br /> </body> </html>恐らくHTMLを書いたことがある人、そしてブラウザからウェブページのソースを覗いたことのある人にとって、
<?php echo 'test';
?>以外の部分は奇異ではないと思います。そして(当たり前ですが)この?phpの部分がPHPのコードです。
仮にこのコードがtest.phpというファイルに書き込まれていたとすると、ブラウザで、例えばhttp://kenbunden.net/test.phpにアクセスすると、
ページタイトル
test あああああ
なんて表示になるはず。
つまり、echoの後にアポストロフィとかシングルクォーテーションで括られた文字列があると、それはHTMLに(微妙な言い方)反映されるのです。
多少は実用的な使い方を考えてみると、例えばPHPにはdate()という日付と時刻に関する便利な関数が存在します。
この関数はOSが時刻を管理するのに使っている整数値を、人間が見て分かり易い形式に変換してくれます。
一般的な場合は、1970年1月1日0時0分0秒からその日その瞬間までの秒数です。
大小を比較したりするのには便利ですが、そんな数字を提示されても人間にはいつのことだかサッパリです。
使い方についてはまぁ…マニュアルでも参照してもらうとして…。
先ほどの’test’の部分をdate(’Y-m-d H:i:s’)に書き換えると、2009-06-25
16:38:32等と表示される様に変わります。
<html>
<body>
<h3>時間を表示してみる</h3>
本日は<?php echo date('Y-m-d'); ?>です。
現在時刻は<?php echo date('H:i:s'); ?>です。<br />
</body>
</html>
なんて書けば、
時間を表示してみる
本日は2009-06-25です。 現在時刻は16:38:32です。なんて表示される訳です。
これぐらいのことJavaScriptでも出来る?その通りです。
しかしJavaScriptではなくPHPを使う最大の魅力は、なんと言ってもブラウザから見ている人にはただのHTMLにしか見えない、と言う点です。
JavaScriptであれば、なにやら怪しげなことが背後で行われているのはわかりますし、多少知識があれば何をやっているか丸見えです。
またブラウザを使って実行しているので、閲覧者がJavaScriptの実行を停止すると、表示もおかしくなります。
PHPであれば、閲覧者の元に届くのは処理を全て終えた後のただのHTMLなので、そういった心配は必要ありません。
(勿論PHPとJavaScriptを組み合わせて使うのは全く珍しくない話ですが)
…思えば遠くへ来たもんだ…。元々の話題は何でしたっけ?
- PHPの特徴
- PHPはプログラミング言語の一つである
- PHPはサーバで実行されるのであって、ブラウザで実行される訳ではない
- PHPはHTMLと混ぜて書くことができる
例えばPHPでは以下の様なスクリプトが頻繁に出てきます。
<?php
$i = 0;
if ($i > 10 ) { ?>
$iは10を超えている。<br />
<?php } else { ?>
$iは10以下である。<br />
<?php } ?>
このコードは、最も基本的な条件分岐を含んでいます。つまり、変数(数学で使うのとはちょっと違います)$iが、10を超えているか否かによって、その後の動作が変化します。
因に$(ドル記号)はPHPにおいて変数を他のPHPコードの類から区別する為の接頭辞(プレフィクス)です。
プログラムはこれが先頭に来ている文字列を、変数として解釈しようとします。
説明の順序が逆になりましたが、変数と言うのはメモの様なものです。
様々な情報に名前付けをして管理するのに用います。
コンピュータの記憶領域の一部にプログラマが勝手な名前を付けて参照する仕組み、と言った所でしょうか。
さてこのコードは、以下のコード
<?php
$i = 0;
if ($i > 10 ) {
echo '$iは10を超えている。';
} else {
echo '$iは10以下である。';
} ?>
と等価です。この、echoを明示的に書かなくても実質的にechoを書いたことになる点を指して、「暗黙のエコー」と勝手に呼んでいる訳です。
さて長々とここまでかかってやっと何が「暗黙」なのか書けたのですが、
マニュアルがいけないと思うのは、入門者へのこのHTMLと混ぜて使える点に関する説明がどうも不十分に感じられるんですよねー。
具体的にはこの[HTMLからの脱出]の部分です。
ここを読むと、開始タグと終了タグで囲まれている 箇所以外のすべての部分は、PHP パーサに無視されます。
とある訳ですが〜。
現実問題、無視されている訳ではないのはお分かり頂けたかと思います。
なんだよちゃんと制御されているじゃん。
もう少し下を見ると、PHP は ?> 終了タグを見つけると それ以降新たに開始タグを見つけるまでの内容を何でも出力するからです
ってなってるんだけど、
それは無視じゃねーだろ。
実際、出力バッファリング関数群で、出力をバッファしてみると、<?php>と<?>に挟まれていない部分も、
あくまでもPHPスクリプトの出力として扱われていることがよくわかります。
でも私にはこの仕様(if文の途中で?>を書いても正常に動作する)はどーも気に食わないと言うか、違和感が拭えないと言うか…。
ヒアドキュメントなんてのもあるんだから、それでいーじゃないかと思ったりするんですよね。
うーん。