ユーザー定義関数
関数は次のような構文で定義されます。
例1 関数の使用法を説明するための擬似コード
<?phpfunction foo($arg_1, $arg_2, /* ..., */ $arg_n){ echo "関数の例\n"; return $retval;}?>
関数の中では、他の関数や クラス 定義を含む PHP のあらゆる有効なコードを使用することができます。
関数名は、PHP の他のラベルと同じ規則に従います。関数名として有効な
形式は、まず文字かアンダースコアで始まり、その後に任意の数の文字・
数字・あるいはアンダースコアが続くものです。正規表現で表すと、
^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$
.
となります。
ヒント ユーザーレベルでの命名の手引き も参照ください。
PHP では、関数は参照される前に定義されている必要はありません。 ただし以下の二つの例のように、条件付きで関数が 定義されるような場合を除きます。
次の二つの例のように、ある条件下でのみ関数が定義される場合には、 その関数定義は関数がコールされる前に 行われていなければなりません。
例2 条件つきの関数
<?php$makefoo = true;/* ここでは関数foo()はまだ定義されていないので コールすることはできません。 しかし関数 bar()はコールできます。 */bar();if ($makefoo) { function foo() { echo "I don't exist until program execution reaches me.\n"; }}/* ここでは $makefooがtrueと評価されているため 安全にfoo()をコールすることができます。 */if ($makefoo) foo();function bar() { echo "I exist immediately upon program start.\n";}?>
例3 関数の中の関数
<?phpfunction foo() { function bar() { echo "I don't exist until foo() is called.\n"; }}/* ここでは関数bar()はまだ定義されていないので コールすることはできません。 */foo();/* foo()の実行によって bar()が 定義されるためここではbar()を コールすることができます。*/bar();?>
PHP では、関数やクラスはすべてグローバルスコープにあります - 関数の内部で定義したものであっても関数の外部からコールできますし、 その逆も可能です。
PHP は関数のオーバーロードをサポートしていません。 また、宣言された関数の定義を取り消したり再定義することも できません。
注意:
関数名は ASCII 文字
A
からZ
で構成されている場合、 大文字小文字を区別しませんが、 通常は関数宣言時と同じ名前で関数をコールする方が好ましいです。
可変引数 および デフォルト引数 の機能をサポートしています。 func_num_args(), func_get_arg(), func_get_args() に関する関数リファレンスを 参照ください。
PHP では、関数を再帰的にコールすることが可能です。
例4 再帰的な関数
<?phpfunction recursion($a){ if ($a < 20) { echo "$a\n"; recursion($a + 1); }}?>
注意:
100 から 200 を超えるようなレベルの再帰呼び出しは避けてください。そんなことをすると、 スタックが破壊され、スクリプトが異常終了してしまいます。 無限に続くような再帰処理は、プログラミングの間違いでしょう。