7. 関数について - 続き
今日は、関数についての説明の続きをやります。
■参照渡し
前回の関数で、関数から戻り値を受け取る方法をご紹介しましたが、戻り値を
2つ以上受け取りたい場合が出てくるかと思います。
戻り値を 2つ以上受け取る場合は、引数を参照渡しという方法で渡し、引数に
値をセットすることで、複数の戻り値を得ることができます。
-----------------------------------------------------------------
$a = 100;
$b = 200;
sub_A ( $a, $b );
print $a;
print $b;
function sub_A ( &$a, &$b ) {
$a = 10;
$b = 20;
}
-----------------------------------------------------------------
《 出力 》
1020
このように、関数定義の部分の引数に、"&"をつけ、引数に対して変更を加えると、
呼び出し元の引数も変更されます。
■関数ライブラリ
毎回新しいページを追加する度に同じ関数をコピペしていたのでは効率も
悪いですし、ファイルサイズが大きくなり、あまりよくありません。
そこで、関数を集めたファイルをライブラリとして保存し、インクルードして
どのページからも関数を使用できるようにする方法をご紹介します。
PHPの場合、関数ライブラリのファイルの記述方法で難しいことは特にありません。
-----------------------------------------------------------------
<?
$a = 100;
function sub_A ($b) {
print $b;
return;
}
?>
-----------------------------------------------------------------
ファイル名は、"common.php"とします。
ファイル名は何でも構いませんが、インクルードするときに使用します。
次に呼び出し側ですが、
-----------------------------------------------------------------
require './common.php';
print $a;
sub_A("TEST");
-----------------------------------------------------------------
requireで、関数ライブラリファイルのパスを指定します。
これだけで、ライブラリの別ファイルがそのままインクルードされたのと同様の
扱いになり、別ファイルで定義した変数や関数がそのまま使用できます。
関数ライブラリファイルを作成すれば、違うページで共有できるだけでなく、
別のサイトのシステムを構築する時にも、ライブラリを持ってくれば、その
関数を使用できるので、大変便利です。
■PHP関数
PHPには、予めいくつもの関数が用意されており、プログラマーはこれを使用する
ことができます。
今まで何度も出てきたprintも、PHPが用意している関数の一つです。こういった
初めから用意されている関数は、特にライブラリのファイルを読み込む処理は
必要なく、すぐに使用することができます。
プログラマーは、これらの関数を使用することで、効率的に開発を進めることが
でき、プログラミングの幅が、ぐーんと広がります。
PHPが用意している関数はたくさんありますので、次回以降、詳しくご紹介
することにし、ここでは、基本的なものの一部をご紹介します。
time() 1970 年 1 月 1 日 0 時 0 分 0 秒(UTC)からの現在までの
秒数を返します。
date($str, $time)
$timeの時間を$strのフォーマットとした文字列を返します。
phpinfo() PHPやWEBサーバの情報をHTML出力します。
rand($n1, $n2) $n1 から$n2の間のランダムな整数を返します。
sleep($sec) $sec秒、プログラムを停止します。
以下は、ローカル時間取得のサンプルです。
-----------------------------------------------------------------
// ローカル時間を取得
$local_date = date('Y/m/d H:i:s', time());
print $local_date;
-----------------------------------------------------------------
date()関数は、第1引数で指定したフォーマットに合わせ、日時を表示させることが
できます。
フォーマット部分は、それぞれ、
Y 4桁の年
m 2桁の月
d 2桁の日
H 24時間表記の時間
i 2桁の分
s 2桁の秒
となります。他にも様々な表記方法があります。
また、現在時刻を表示するのであれば、第2引数は省略できます。第2引数は、
UNIXのタイムスタンプを指定します。
UNIXのタイムスタンプというのは、1970 年 1 月 1 日 0 時 0 分 0 秒から
1秒ずつカウントされた値になります。これは時間計算などでよく使用しますので
覚えておくと良いでしょう。
time()関数は、現在のローカルマシン時間をUNIXタイムスタンプで取得します。
また、曜日を表示するサンプルもご紹介します。
-----------------------------------------------------------------
$week = array('日', '月', '火', '水', '木', '金', '土');
// ローカル時間を取得
$local_date = date("Y/m/d", time());
$local_date .= "(" . $week[date("w")] . ")";
$local_date .= date(" H:i:s");
print $local_date;
----------------------------------------------------------------
曜日は、"w"で取得することができますが、日曜日を 0とした整数の配列で
取得しますので、曜日の文字列の配列を別途作成する必要があります。
0 = 日曜日
1 = 月曜日
2 = 火曜日
3 = 水曜日
4 = 木曜日
5 = 金曜日
6 = 土曜日
さらに、文字列を連結すれば、うまく日付が表示されると思います。
次に、残りの 3 つの関数のサンプルを以下に記述します。
-----------------------------------------------------------------
// PHP情報を表示します。
phpinfo();
// $a 秒間停止します。
$a = 5;
sleep($a);
// 0 〜 9 のランダムな値を取得します。
print rand(0, 9);
-----------------------------------------------------------------
一番最初に試したかもしませんが、phpinfo()関数を呼ぶと、PHP情報をHTMLで
表示させることができます。
また、sleep()は、指定した秒数、文字通りスリープします。実際に実行すると
しばらくプログラムが停止します。
sleep()は、ループなどで間をあけて実行したい時などに使用します。
rand()は、ランダムに数字を発生させます。第1引数と第2引数の間で、ランダムな
整数を返します。
rand()は、自動生成のパスワードなどで使用します。
★今日のまとめサンプルプログラム
common.php
-----------------------------------------------------------------
<?
function sub_A (&$a, $b) {
$a = "TEST2"; // 呼び出し側に反映される
$b = 1000; // 呼び出し側に反映されない
}
?>
-----------------------------------------------------------------
index.php
-----------------------------------------------------------------
<?
require './common.php';
?>
<HTML>
<BODY>
<?
$a = "TEST";
$b = 326;
// 読み込んだパッケージの関数を呼ぶ
sub_A($a, $b);
print '$a = ' . $a . '<br>';
print '$b = ' . $b . '<br>';
// 時間を表示
print 'time = ' . time() . '<br>';
print 'localtime = ' . date("Y年 m月 d日 H時 i分 s秒") . '<br>';
// 0 から 100 までのランダムな整数を表示
print 'rand = ' . rand(0, 100) . <br>;
?>
</BODY>
</HTML>
-----------------------------------------------------------------
■解説
外部のパッケージを読み込んだサンプルです。外部パッケージ(common.php)と、
実行ファイル(index.phpの 2つのファイルを作成する必要があります。
また、参照渡しによって、関数からの戻り値を得ていることを確認してください。
time()関数の戻り値をそのまま表示すると、UNIXタイムスタンプの整数が表示
されます。
また、rand関数の整数部分のみを得るには、上のサンプルのようにします。
更新ボタンを押すと、ランダムに整数を取得できているのが分かるかと思います。
★課題
1. 次の関数を作成し、別ファイルにまとめてパッケージ化してください。
(1) 2つの引数を受け取り、それぞれ 2で割った値を返す関数
(2) 3つの引数を受け取り、"・・・番目の引数は・・・"という文字列をそれぞれに
付け足して返す関数
(3) 現在日時を、"2005/01/01 23:00:00"というフォーマットで返す関数
(4) 現在の曜日を
('日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日')
のいずれかで返す関数
(5) 0 〜 9秒間、ランダムでプログラムが停止(スリープ)する関数
★前回の課題の解答
1. 以下の条件を満たす関数を作成してください。
(1) 2つの引数を受け取り、積(掛け算)の結果を返す関数
(2) 3つの引数を受け取り、引数を全てをprintする関数
(3) 引数を1つ受け取り、値が100以上の場合に、"True"の文字列を返す関数
(4) 2つの引数(整数)を受け取り、2つの引数の値が同じ場合に、"True"の
文字列を返し、違う場合は"False"の文字列を返す関数
→下のサンプルを参照してください。
-----------------------------------------------------------------
<HTML>
<BODY>
<?
// (1)
print sub_1(5, 6);
print "<br>";
// (2)
sub_2("This ", "is a ", "test.");
print "<br>";
// (3)
print sub_3(156);
print "<br>";
// (4)
print sub_4(53, 52);
?>
</BODY>
</HTML>
<?
// (1)の関数
function sub_1 ($a, $b) {
return $a * $b;
}
// (2)の関数
function sub_2 ($a, $b, $c) {
print $a . $b . $c;
}
// (3)の関数
function sub_3 ($a) {
if ($a >= 100) {
return "True";
}
}
// (4)の関数
function sub_4 ($a, $b) {
if ($a == $b) {
return "True";
} else {
return "False";
}
}
?>
-----------------------------------------------------------------
■解説
関数側の部分が解答例になります。呼び出し側は、どのように呼んでも
構いません。
引数を変えて試してみるのも良いかと思います。
特に難しい処理はないかと思いますが、関数の感覚をつかんでいただければと
思います。
|