■文法
大文字と小文字は区別されない。functionキーワードの後に関数名が続く。
<?php function func(){ //code } ?>
有効な関数名
^[a-zA-Z_][a-zA-Z0-9_]$
但し、システムで今後使用される可能性があるため、アンダーバー(アンダースコア)が2つ続いて始まる関数名は極力使用しない方が良い。
■戻り値(返り値)
PHPでは、関数は必ず戻り値を発生させる。returnを記述しなかった場合は、nullが戻り値となる。通常はreturnを実行すると、関数は残りの処理を行わない。
<?php function hello($name){ return "Hello, " . $name . "!"; } $txt = hello('John'); echo $txt;//display : Hello, John! ?>
参照で戻り値を渡す為には以下のように記述する。
<?php function &execute($sql){ $result = mysql_query($sql); return $result; } $result = &execute("SELECT * FROM `table`"); ?>
この場合、$resultは関数内部の$resultの参照になる。但し、大きな文字列や配列を戻り値とし、さらにそれを後で変更する場合以外では、参照渡しのコストの方が高くつく。また、この記法を用いる場合、戻り値は必ず発生し、かつ変数でなければならない。
■Passing Arguments(引数)
関数の挙動をコントロールするなどの目的で、任意の数の引数を関数に渡せる。
<?php function hello($name){ echo "Hello, {$name}."; } hello('John');//Hello, John. ?>
デフォルト値を持った引数を設定
引数を渡さなかった場合、デフォルト値が適用される。
<?php function hello($name = 'John'){ echo "Hello, {$name}."; } hello();//Hello, John. hello('Nick');//Hello, Nick. ?>
デフォルト値を持たないパラメータを全て指定した後に、デフォルト値を持った引数はいくつも指定が可能である。以下の場合、引数$msgは指定しなければならない。また、$name1のみデフォルト値を指定し、$name2だけ任意の値を指定する、といった事は行えない。
<?php function hello($msg, $name1 = 'John', $name2 = 'Nick'){ echo "$msg, {$name1} and {$name2}."; } hello('Hello');//Hello, John and Nick. ?>
Passing Arguments by Reference(引数の参照渡し)
参照渡しの引数を使うと、関数内から関数外の変数の操作が出来る。
メモリを意識して楽しいといえば楽しいのだが、コードの可読性が下がる気がする。理屈だけ覚えて、個人的な範囲で実用は避けようと思う。
<?php function add(&$a){ $a++; //通常であれば、変数を操作してもスコープが異なるので関数外には影響しない } $num = 1; add($num); echo $num;//2 //メモリの住所を渡しただけなので、その場所に対して関数内で処理がされる ?>
PHP4では出来ないが、PHP5では以下のように参照渡しの引数にもデフォルトの値を設定することができる。
<?php function add(&$a= 0){ $a++; } add(); ?>
■Variable-length Argument Lists(可変引数)
<?php function calc(){ $array = func_get_args(); $count = func_num_args(); //$value = func_get_arg((int) $index_number); if($count === 0){ return 0; } else{ $answer = 0; foreach($array as $key => $value){ $answer = $answer + (int) $value; } return $answer; } } print(calc(1,5,4,8));//18 ?>
各関数について
- array func_get_args(void)
- 関数の引数を配列として返す
- int func_num_args(void)
- 関数の引数の数を返す
- mixed func_get_arg((int) $num)
- $num番目の引数の値を取得する
関数で明示した引数がある場合は、func_get_args、func_num_args、func_get_argの各関数にその引数も含まれる。
また可変引数は非常に強力であるが、引数をいくつ受け付けるのかがパッと分からないためにコードが読みづらくなる欠点がある。
■可変関数
コードが読みづらくなり滅多に使われることがないが、変数に呼び出し用の括弧をつけて関数とすることもできる。
<?php function first(){ print('This is first.'); } $which = 'first'; $which();//This is first. ?>