作成日:2006/05/10
1K 関数
PHPの関数定義はどちらかと言うとC++ に似ています。
正確には C++ を Better C として使用した場合の話です。
C は C++ になってからリファレンスや引数のデフォルト値をサポートしました。
定義された関数は呼び出して使う事ができます。この場合、関数呼び出しの後で関数定義があっても構いません。 但し、if文などの条件文の中や、関数の中で、関数が定義されている場合は、 呼び出しに先立ち関数定義が行われている必要があります。
用例:関数の定義
function foo($arg1, $arg2, /* 関数へデータを渡すには引数を使います */ )
{
return $retval; /* return文で戻り値を返す事ができます */
}
1K.1 関数の引数
PHPは、値渡し、参照渡し、引数のデフォルト値、可変長引数リストをサポートしています。
- デフォルトは値渡しです。
- 参照渡しするには仮引数の前にアンパサンド(&) を付けます。
- PHPはC++風のデフォルト引数をサポートします。即ち、仮引数の後に=に続けて定数を書きます。
- 配列やNULL値を引数のデフォルト値にする事もできますが、変数をデフォルト値にする事はできません。
- PHPではfunc_num_get()/func_get_arg()/func_get_args()関数を使って可変長引数を使用する事ができます。
| 引数の渡し方 | 用例 |
|---|---|
| 値渡し (デフォルト) |
$b = array_product($a, 2);
// ベクトルaに定数bを乗じたベクトルを返す
function array_product($a,$k)
{
$b = array();
for ($i=0; $i<count($a); $i++) $b[] = $k * $a[$i];
return $b;
}
|
| 参照渡し |
array_product($a, 2);
// ベクトルaに定数bを乗じる
function array_product(&$a,$k)
{
for ($i=0; $i<count($a); $i++) $a[$i] = $k * $a[$i];
}
|
| 引数の デフォルト値 |
array_product($a);
// ベクトルaに定数bを乗じる(定数bのデフォルトは1)
function array_product(&$a,$k=1)
{
for ($i=0; $i<count($a); $i++) $a[$i] = $k * $a[$i];
}
|
| 可変長引数 |
$sum = sum(1,2,3,4,5); // 15を返します
$sum = sum(1,2,3,4,5,6,7,8,9,10); // 55を返します
function sum()
{
// func_num_args()は引数の数を返します
$argc = func_num_args();
for( $sum=$i=0; $i<argc; $i++ )
// func_get_arg($i)は(0から始まる)$i番目の引数を返します
$sum += func_get_arg( $i );
}
|
1K.2 関数の戻り値
PHPの関数は、スカラー、配列、オブジェクトなどの全ての型を返す事ができます。 またPHPではリファレンスを返す事もできます。
用例:配列を戻す
list( $year, $mon, $day ) = get_ymd(time());
function get_ymd($timestamp){
return explode('-',date("Y-m-d",$timestamp ));
}
1K.3 リファレンスを返す関数
リファレンス第3の用法(第1は変数のエイリアス、第2は引数の参照渡し)はリファレンスを返す関数を作る事です。 この用法は、エイリアスとなるべき変数を見付ける関数を作る場合に使用されます。
用例:
$foo = 1;
$bar = 2;
function &find_var($conditoon)
{
global $foo; # the same as $foo =& $GLOBALS["foo"];
global $bar; # the same as $bar =& $GLOBALS["bar"];
if ($conditoon){
return $foo;
}else{
return $bar;
}
}
$num =& find_var(0); // $barのエイリアス$numを作ります
$num ++;
echo "$num"; # 3を出力します
echo "$bar"; # 3を出力します
- リファレンスを返す関数の定義では、関数名の前に & を使用し、return文で変数を指定します。
※上例で、 return ($condition)?$foo:$bar; とすると、 式評価後の値のリファレンスが戻ります。
(上例では3と2を出力します)
- 関数の呼出し側で、リファレンスを受け取る場合は =& を使用します。
※上例で、 $num = find_var(0); とすると、 リファレンスが参照する値が $num に代入されます。
(上例では3と2を出力します)
