functionを使用して、関数を定義します。
tashizan関数を定義する(test1.php)
<?php
// 引数との加算関数
function tashizan( $number ) {
return $number + 50;
}
// tashizan()関数を呼び出します
echo tashizan( 50 );
?>
上記のスクリプトでは、functionに続けて任意の関数名「tashizan」を指定しています。
このtashizan()関数は、引数として渡される変数$numberに50の加算を行います。よって、関数名の変数に続けて「()かっこ」の中に、引数を記述します。なお、関数の範囲を明示するために「{}(中かっこ)」で、実行するコードを囲います。
関数を実行するためには、関数名に「()かっこ」を付けて呼び出します。もし、引数が必要な場合は、「()かっこ」に記述します。
実行結果
100また、下記の関数のように、複数の引数を渡すこともできます。その際には、引数を「,(カンマ)」で区切って並べます。
複数の引数を渡すkakezan関数を定義する(test2.php)
<?php
function kakezan( $number1, $number2 ) {
return $number1 * $number2;
}
// kakezan()関数を呼び出します
echo kakezan( 10, 20 );
?>
実行結果
200前節のスクリプトのように、関数では引数を使用して値を渡すことができます。引数は「,(カンマ)」で区切ることによって、複数指定することができ、また、その引数に配列を渡すこともできます。
引数に配列を渡すwarizan関数を定義する(test3.php)
<?php
// 引数に配列を指定します
function warizan( $number ) {
return $number[0] / $number[1];
}
// warizan()関数を実行します
echo warizan( array( 3000, 10 ) );
?>
実行結果
300上記スクリプトでは、「echo warizan( array( 3000, 10 ) );」の「array( 3000, 10 )」の「3000」と「10」はそれぞれ[0]と[1]に格納され、「3000/10」という計算がされています。
引数名に「&(アンパサンド)」を付けると、引数を参照渡しで渡すことができます。引数を参照渡しにすると、参照先の変数の値を変更することができます。
参照渡しで引数を渡す
<?php
// 引数参照渡しで渡します
function job( &$syokugyo ) {
$syokugyo = '会社員';
}
$str = '大学生';
echo "関数実行前の¥$str : $str<br />¥n";
// job()関数を実行します
job( $str );
echo "関数実行後の¥$str : $str";
?>
実行結果
関数実行前の$str : 大学生上記の関数の実行結果を見てみると、変数$strには初期値として「大学生」がセットされています。しかし、job()関数の実行後には、「会社員」に変更されていることがわかります。
PHPで定義される関数では、※スカラー引数に関して以下のようにC++スタイルのデフォルト値を定義することができます。
引数にデフォルト値を指定する
<?php
function job( $syokugyo = "大学生" ) {
return "職業は $syokugyo です。<br />¥n";
}
echo job();
echo job( "会社員" );
?>
実行結果
職業は 大学生 です。上記のスクリプトでは、「job( $syokugyo = "大学生" )」によって、$syokugyoはデフォルトで「大学生」となっています。以上から「echo job();」の「job()関数」を引数に何もない状態で実行すると必ず「大学生」が出力されます。
関数を実行した結果を得るためには、returnを使います。
returnで関数の実行結果を返す
<?php
// 引数と100の乗算関数
function kakezan( $number ) {
return $number * 100;
}
// kakezan()関数を呼び出します
echo kakezan( 4 );
?>
上記の関数では、計算式「$number * 100」の結果をreturnで返しています。よって、関数を呼び出したechoの出力結果に、kakezan()関数の計算結果が表示されます。
returnは複数の値を返すことができません。しかし、値ではなく配列を返すことによって、複数の値を返すことができます。
実行結果
400返り値に配列を指定する
<?php
// 返り値を配列で返します
function kakezan( $number1, $number2 ) {
$number1 = $number1 * 100;
$number2 = $number2 * 1000;
return array( $number1, $number2 );
}
// kakezan()関数を実行します
list( $result1, $result2 ) = kakezan( 5, 6 );
echo "$result1<br />¥n";
echo "$result2";
?>
実行結果
500よく使う関数は別ファイルに用意しておき、複数ページで共通に利用できるようにしておけば、同じ関数を何度もコードに書くよりは、はるかに手間が省けます。
別ファイルにまとめたプログラム処理を読み込むことができれば、開発の効率やメンテナンスの点で非常に有用です。
require()関数は、スクリプト内で別ファイルを読み込むことができます。
実際にスクリプト内で別ファイルを読み込んでみます。まず、読み込む対照の「language.php」ファイルを作成します。
language.phpのソース
<?php
define( "language", "PHP" );
?>
次に、require()関数でlanguage.phpを読み込みます。
language.phpを呼び出すスクリプト
<?php
require( "language.php" );
echo language;
?>
上記のスクリプトでは、require文の引数に、読み込む対照のファイル名を渡しています。すると、このスクリプトが実行されるとき、指定されたlanguage.phpに置き換えられます。
実行結果
PHPrequire_once()関数は、require()関数と同様に、スクリプト内で別ファイルを読み込むことができます。ただし、require()関数と異なる点は、require()関数は外部ファイルを取り込む回数に制限がないのに対して、require_once()関数は外部ファイルを1回だけ取り込みます。
例えば、「a.php」に「b.php」をrequire()関数で読み込んだ場合、「b.php」に「a.php」のrequire()命令が記述されていた場合、無限ループになってしまいます。
require()関数と同様にinclude()関数も、スクリプト内で別ファイルを読み込むことができます。
これから記述するスクリプトは、ループ処理の中にinclude文を置いて、毎回異なるファイルを読み込むようにしています。
include文で繰り返し実行する(include.php)
<?php
for( $i=1 ; $i<=3 ; $i++ ) {
include( "test" . $i . ".php" );
}
?>
上記のスクリプトでは、ループが実行されるたびに「test1.php」「test2.php」「test3.php」のファイルが存在した場合、各phpファイルを読み込んでいます。読み込む対照の各phpファイルは、同章でtashizan関数、kakezan関数、warizan関数をそれぞれ定義したファイルです。
実行結果
100200300include_once()関数は、include()関数と同様に、スクリプト内で別ファイルを読み込むことができます。include_once()関数も、require()関数とrequire_once()関数との違いと同様に、include_once()関数は外部ファイルを1回だけ取り込みます。
require()とinclude()は、エラーの扱い方を除けば、その振る舞いは全く同じです。エラーが発生するとinclude()は「Warning」を出力しますが、require()を使用している場合は「Fatal Error」となります。
言い換えると、指定されたファイルが無い場合に処理を停止したい場合は、require()を使用した方が良いということになります。 include()を使用すると、読み込むべきファイルが存在しない場合も処理が続行されます。
具体的に、include()文で記述したスクリプトを使用して、実際に読み込むべきファイル「test2.php」が存在しない場合、require()とinclude()では結果にどのような違いが現れるかを試してみます。
存在しない「test2.php」をrecuire()で読み込む
<?php
for( $i=1 ; $i<=3 ; $i++ ) {
require( "test" . $i . ".php" );
}
?>
実行結果
100上記のスクリプトでは、「test1.php」を読み込んだ後、次に読み込もうとした「test2.php」が存在しないため処理を停止し、「Fatal Error」を表示しています。
存在しない「test2.php」をinclude()で読み込む
<?php
for( $i=1 ; $i<=3 ; $i++ ) {
include( "test" . $i . ".php" );
}
?>
実行結果
100上記のスクリプトでは、「test1.php」を読み込んだ後、次に読み込もうとした「test2.php」が存在しないため「Warning 」を表示しています。しかし、処理は停止することなく、次の「test3.php」を読み込み、最後まで処理が続行されました。