初心者による初心者のためのPHP講座 第2回 PHPの基本構造

初心者による初心者のためのPHP講座 第2回 PHPの基本構造第2回では、PHPプログラムの基本構造について説明する。

プログラミング環境の準備

前回、テキストエディタの準備が必要であることを書いたが、「TeraPad」を例に話を進めてゆく。

インストールが完了したら、まず、文字コードと改行コードの設定しておくと良いだろう。

「TeraPad」の場合は、「表示」メニューから「オプション」を実行し、「文字コード」タブを開くと、ファイルを開いた際の文字コードである「初期文字コード)」保存する際の文字コードである「保存文字コード」の設定が出来るようになっているので、それぞれ設定しておく事。

テキストにマルチバイト文字を含まない限り、文字コードの「自動判別」は効かないので、意識しなくとも意図した文字コードで保存されるようにするためにも必要な設定である。

PHPは、Unix環境で動作させる事が多い事もあり、

文字コード:EUC(EUC-JP)、 改行コード:LF

が使われることが多く、これは無難な設定である。

私の場合は、WordPress用のプラグインを作ることが多く、ウェブサイトもUTF-8で記述する事が多いので、

文字コード:UTF-8N(UTF-8、BOMなし)、改行コード:LF

に設定しており、この講座は、この設定を前提に話を進めてゆく。

ファイルの拡張子

PHPで記述されたコードを含むファイルの拡張子は、原則として「php」とする必要がある。

ファイル名には、半角英数字を使用し、区切りが必要な場合は「.」や「-」、「_」を使用する。

そして「.php」で終わるようすること。

アップロードと実行

PHPで記述されてファイルは、HTMLで記述されたファイル同様に、ウェブサーバーにアップロードすれば良い。

拡張子は異なるものの、実行もHTMLの場合と全く同じ要領であり、「http://example.com/index.php」のようなURLをブラウザに入力してアクセスすれば良い。

基本構造

PHPは、下記のようにHTMLに簡単に組み込むことが出来る。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHPの基本構造</title>
</head>
<body>
<p>PHPで日付を表示します。</p>
<p>今日は、<?php echo date("Y/m/d"); ?> です。</p>
</body>
</html>

上記のスクリプトの実行結果を表示

PHPによる記述は、

<?php PHPでの記述 ?>

の部分であり、PHPのプログラムは、「<?php」で始まり「?>」で終わる必要がある

この「<?php」と「?>」に囲まれた間に、PHPで命令文を記述してプログラムを作成する。

複数の命令文を書く事も可能で、「;」が命令文の区切りを表し、各命令文の最後には「;」を付ける必要がある。

例外として「?>」の直前の命令文は「;」を省略することが出来るが、命令文には「;」を付けることを習慣とした方が良い。

また、「<?php」と「?>」で囲まれたPHPプログラムは、1つのファイル内で複数回登場しても良い。

逆に「<?php」と「?>」に囲まれない範囲にあるHTMLによる記述は、そのままHTMLとして処理される。

つまり、HTMLとPHPを、簡単に混在させることが出来る。

サンプルプログラムでは、下記のコードで、現在の日付を動的に表示している。

<?php echo date("Y/m/d"); ?>

ここでは、echo()date()と言う2つの関数を使用している。

「関数」とは、「与えられた値(引数)を元に処理を行い、結果(戻り値)を返す」という役割を担う命令文で、PHPプログラム内の処理の中心となる構造物である。

関数を電子レンジに例えるなら

  • 引数・・・温める時間。
  • 処理・・・物を温める。
  • 戻り値・・・加熱の終了を知らせる音。

と言ったところだろうか。

シンプルな時計は、引数を必要としないが、時刻の計算処理を実行し、戻り値として現在の時刻を常に返すと言えるかもしれない。

実際、サンプルスクリプトでも使用しているdate()関数は、時計と似ている。

関数は、通常、下記のように記述する。

関数名(引数)

サンプルプログラムを見るとechoには「()」が無く、これは関数のルールから外れているように思えるが、echo()の場合は「()」を省略出来る。

「()」が省略できるのは、echo()は厳密には関数ではなく、「言語構造」と呼ばれるものであるためだが、ともかく、echo()は、こう言うものと理解しておこう。

ただし、ここでは便宜上、関数として扱う。

echo()の「()」を省略せずに

<?php echo(date("Y/m/d")); ?>

と書くことも出来るが、通常は、このような書き方はしない。

date()関数は、現在の日付を計算する関数で、引数として日付のフォーマット(Y/m/d)を関数に渡し、戻り値として現在の年月日を返させている。

echo()関数は、引数をブラウザに表示する処理を行う。

この場合、echo()関数の引数は、date()関数の戻り値であり、結果としてブラウザには、現在の年月日が「/」区切りで表示される。

このサンプルプログラムでは、date()関数の引数に文字列(別の機会に詳しく)を使用しているが、文字列は「”」や「’」で囲むなどする必要がある。

関数には、引数、処理、戻り値の3つが必ずしもセットになっているとは限らない。

例えば、echo()関数は、引数を必要とし、引数をブラウザに表示する処理を行うが、戻り値は返さない。

echo()関数と同等の処理を行う関数として、print()関数があるが、こちらは戻り値を返す。

ちなみにprint()も厳密には関数ではなく、言語構造。

echo()関数やdate()関数は、PHPで予め定義された関数で、同様の関数は他にも沢山あり、「関数リファレンス」で見つけることが出来る。

※関数リファレンスでは、「引数」は「パラメーター」、「戻り値」は「返り値」と表記されている。

このような定義済み関数の他に、自身で関数を定義して使用することも出来る。

サンプルプログラムでは、下記にもPHPを使用している。

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

これは、

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

に含まれる「<?」という構造が、PHPであると誤って解釈されるため、直接記述した場合は、(PHPではないため)エラーになってしまう。

そこで、echo()関数を使って表示させるようにしてる。

また、metaタグで文字コードを「UTF-8」に指定しているが、この場合は、この「.php」ファイルは、UTF-8で保存されなければならない。

空白や改行は無視される

PHPプログラムが実行される際、プログラム中の空白(タブも)や改行は無視され、意味を持たない。

以下の4つの文は、全く同じ意味になる。

<?php echo "今日の日付は "; echo date("Y/m/d"); echo " です。"; ?>
<?php
echo "今日の日付は ";
echo date("Y/m/d");
echo " です。";
?>
<?php
echo
"今日の日付は ";
echo date("Y/m/d");
echo " です。";
?>
<?php
	echo "今日の日付は ";
	echo date("Y/m/d");
	echo " です。";
?>

言い換えれば、プログラムが見やすいように改行したり、インデントすることが許されている。

ただし、「”」や「’」で囲まれるなどした文字列中の空白や改行は無視されない。

上記の4つの例でもecho()関数の引数が、空白を含む文字列になっているが、ブラウザ上でも空白として表示される。

次の例は、上記の4つの例とは異なる意味を持つ。

<?php
echo
"今日の
日付は ";
echo date("Y/m/d");
echo " です。";
?>

ブラウザ上では「今日の」と「日付は 」の間に改行が入って表示される。

コメント文

PHPでは、コメント文を書くことが出来る。

コメント文は、PHPプログラムが実行される際には、無視され、処理結果に影響を与えない。

コメント文は、プログラム中にどんな処理をしているかなどの情報を残す時、命令文の一部を一時的に処理から省きたい時に便利である。

「#」や「//」で始まる行はコメントと見なされる。

<?php
echo
"今日の日付は ";
// 今日の日付を表示
echo date("Y/m/d");
echo " です。";
?>
<?php
echo
"今日の日付は ";
echo date("Y/m/d");
// echo " です。";
?>

「/*」と「*/」で囲まれた範囲もコメントとして見なされ、複数行に渡ってコメントを書く場合などに便利である。

<?php
/*
今日の日付を表示するプログラム
by redcocker
/*
echo "今日の日付は ";
echo date("Y/m/d");
echo " です。";
?>

命令文の実行順序

PHPの命令文は、どのような順序で実行されるのだろうか?

それは次のサンプルスクリプトの実行結果からも予想出来る。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>命令文の実行順序</title>
</head>
<body>
<?php
echo "<p>これは1番目</p>";
echo "<p>これは2番目</p>";
echo "<p>これは3番目</p>";
?>
</body>
</html>

上記のスクリプトの実行結果を表示

echo()関数によって、ブラウザに表示される文字は、スクリプトの記述の順番通りであることが分かる。

つまり、PHPで記述されたスクリプトは、上から順に実行される。

PHPの限界

次のサンプルプログラムは、最初のサンプルプログラムを少し改造したものである。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHPの限界</title>
</head>
<body>
<p>PHPで日付と時刻を表示します。</p>
<p>今日は、<?php echo date("Y/m/d l H:i:s"); ?> です。</p>
</body>
</html>

上記のスクリプトの実行結果を表示

このサンプルプログラムでは、date()関数の引数を変更し、日付だけでなく、曜日、時刻まで表示されるようにしている。

PHPは、ブラウザからページが参照されたタイミングで実行され、ページがブラウザに表示された時点でPHPの実行は終了している。

date()関数を使って時刻を取得したとしても、それは実行のタイミング、つまり、ブラウザでURLを入力してページをリクエストし、ページが表示されるタイミングの時刻であり、リアルタイムで秒の部分が変化するわけではない。

リアルタイムで時刻を表示させようと思うと、PHPではなく、Javaスクリプトで記述されたプログラムを使うなどする必要がある。

PHPを実行させるには、ブラウザでPHPで記述されたページを表示するか、再読み込みする必要がある。

これはPHPの仕様であり、制限でもある。

PHPだけに固執するのではなく、HTML、PHP、Javaスクリプトなどを組み合わせることで、機能的なサイトを構築することが出来ると言える。



PHP, PHP講座, ネット・PCPermalink