はじめにお断りしておきます。PHPのスクリプトの書き方や制御文・関数などを1から学びたい人向けの(いわゆるテキスト本やチュートリアルのような)解説ではありません。どちらかというと「習うより慣れろ」、「考えるよりやってみろ」的スタンスでPHPの要所やコツみたいなところを書いていくつもりです。不親切な解説になると思いますが、1から優しく易しく解説しているサイトはいくらでもあるので、わざわざ同じような解説をやらなくてもいいでしょうし…。本当に良いサイトがあるんです。
PHPのスクリプトは<?php
または<?
という開始タグと?>
という終了タグ内に記述します。PHPの開始タグは<?php
が推奨されています。なぜなら、 XHTMLのようなXMLに適応したコードでPHPを使用できるからです。 <?
は短縮型のタグで使用は推奨されていません。また、PHPの設定によっては短縮型のタグが無効な場合もあります(デフォルトでは有効です)。
PHPはファイル中にこの開始タグを見つけると、開始タグと終了タグの間にあるスクリプトを実行します。このスクリプトの開始と終了を宣言するタグの外にある文字列は単純に出力されるだけなので、HTML文書の中にスクリプトを埋め込むことができるわけです。もちろん、HTML文書として必要な要素や内容をすべてスクリプトにより出力することも可能です。
簡単な例としてそのウェブページの更新日時を表示してみます。下の例のスクリプトの行が実際にこの段落のすぐ下に書いてあります(ページソースを見てもわかりませんよ)。
最終更新日時:2006/08/05
<html> <head> <title>このページの最終更新日時</title> </head> <body> <?php echo "<p>最終更新日時:".date("Y/m/d",getlastmod())."</p>" ?> </body> </html>
echo
は文字列を出力する命令です。date(フォーマット文字列,タイムスタンプ)
は指定されたタイムスタンプを与えられたフォーマット文字列によりフォーマットし、日付文字列を返します。getlastmod()
は現在のファイルの最終更新時刻をUNIXタイムスタンプとして返し、エラーの場合はFALSE を返します。
”<p>最終更新日時:”は文字列なので二重引用符(ダブルクォーテーション)で括ります。文字列はピリオドで結合できます。date()は結果を返す関数なので、その結果を”"<p>最終更新日時:”と結合し、p要素の終了タグも結合して、echoで出力しています。
echoには下記のように<?
に直接続けて="文字列"
と書く省略形があります。<?="文字列"
はワンセットです。
<?="<p>最終更新日時:".date("Y/m/d",getlastmod())."</p>" ?>
さて、上の例ではechoで最終更新日時を表示するという1つの命令(文)だけですが、複数の命令を書く時は1つの命令の区切りとして文の最後にセミコロン”;”をつけます。下の例のスクリプトは条件文を使ってアクセスした時間によって異なるメッセージを表示します(このスクリプトが実際にこの段落のすぐ下に書いてあります)。
こんばんわ!今日も一日お疲れ様でした。<?php $nowtime=getdate(); if ($nowtime[hours] <= 4 ) { $string ="もう深夜ですよぉ。寝なくて大丈夫ですか?"; } elseif ($nowtime[hours] <= 9 ) { $string="おはようございます!それともこれからおやすみですか?"; } elseif ($nowtime[hours] <= 17 ) { $string="こんにちは!今日はどこからアクセスですか?"; } else { $string="こんばんわ!今日も一日お疲れ様でした。"; } echo $string ?>
getdate(タイムスタンプ)
は指定したタイムスタンプに関する日付情報を有する連想配列を返します。タイムスタンプを指定しない場合は現在のローカルな時間(サーバの時間)を指定したことになります。$nowtime[hours]
はgetdate()によって返された「現在の時間(0〜23)」が入っている配列変数です。ifから始まる条件文は、「もし現在時刻が4以下だったら、4以下でなくて9以下だったら、4以下でも9以下でもなくて17以下だったら、以上の条件に当てはまらなかったら」という評価を順番にして、その条件に合った場合は$string="";
で出力するメッセージを$stringという変数に代入しています。そして最後にecho $string
でそのメッセージを出力してスクリプトは終了です。この文の最後にはセミコロンがありませんが、終了タグ?>
はセミコロンを兼ねているので、スクリプトの最後の文に限ってはセミコロンを付けなくても大丈夫なのです。
長いスクリプトをHTMLファイル中に記述するとHTMLソースの見通しが悪くなります。また、複雑なスクリプトや複数のページで同じスクリプトを使っている場合は、メンテナンスも面倒になります。そんな時はそのスクリプトのみを書いたファイルを用意してそのファイルをinclude()
やrequire()
等で読み込んで実行するようにすると便利です。2つ目の例のスクリプトを”timemess.php”というファイルに保存してinclude()を使用して実行させるには下記のように記述します。読み込むファイルは相対パスか絶対パスで適切に指定します(例では呼び出すファイルと同じ場所にあります)。
<html> <head> <title>include()で時間毎にメッセージ</title> </head> <body> <?php include("./timemess.php") ?> </body> </html>
include()とrequire()の違いはエラーの扱い方だけです。エラーが発生すると、include()ではWarningを出力し処理を続行しますが、require()ではFatal Errorとなり処理を停止します。Fatal Errorではエラーが発生した個所で処理が停止する(以降一切出力されません)ので、エラーが発生しても処理を続行させたい場合(アクセスカウンターなど)はinclude()を使用したほうが良いでしょう。
include()やrequire()で読み込んだスクリプトは、include()もしくはrequire()が実行された行の変数スコープを継承します。故に、変数の再代入や関数の再定義という問題が起きることがあるので、変数・関数の名前や処理には注意しておかなければなりません。include()等で複数のファイルを読み込んでいる場合に期待通りに動作しなかったらそこらへんを見直してみましょう。指定ファイルを一度だけ読み込みたい時は、include_once()
やrequire_once()
を使用します。
スクリプト中に説明や覚え書きなどをコメントとして書いておくことができます。3種類の書き方があるので状況(とか好み)に応じて使い分けます。
<?php echo "この行にはコメントがあります。"; // 一行コメント echo "この行にもコメントがあります。"; # 一行コメント /* 複数行コメント 大きなブロックをコメントアウトしたい時はこちら */ echo "この行の上には複数行のコメントがあります。"; ?>
一行コメントの始まりは//
または#
で、改行もしくはPHPの終了タグ(?>
)までがコメントとなります。
複数行コメントの始まりは/*
で、*/
までがコメントとなります。複数行コメントのネスト(入れ子)はできません。