feeds2011/09/06カテゴリー:PHPPHPのユーザー定義関数Tweet関数とは、簡単に言うと特定の処理をまとめたものです。関数をうまく利用することで効率的にプログラムを組むことができます。PHPには、多くの関数が予め定義されていますが、開発者自身が独自に関数を定義することもできます。開発者が定義する関数をユーザー定義関数といいます。関数を定義するには、functionキーワードを使用します。関数名や引数名は、PHPの識別子のルールに従う必要があります。関数はグローバルスコープに定義されるため、関数名は定義済みの関数と重複しない名前にする必要があります。引数や戻り値は必要なければ省略可能です。戻り値;}?&gt;PHPでは、基本的に関数定義より前に関数を呼び出しても問題ありませんが、条件付きで定義される関数に関しては、関数が定義されてから呼び出す必要があります。errorとなります。出力:bar?&gt;関数の引数デフォルトでは、関数の引数は値渡しとなります。下記の例では、関数内の処理で引数で渡された配列の要素の値を変更していますが、関数実行後に元の配列の値を出力すると変更されていないことが確認できます。出力:1?&gt;参照渡ししかし、関数定義の引数の前に&を付けることで参照渡しにすることができます。下記は、先程のコードの引数に&を付けただけですが、出力結果を見ると参照が渡されたことがわかります。引数には、下記のようにデフォルト値を指定することができます。デフォルト値を持つ引数の後にデフォルト値を持たない引数を定義することはできません。デフォルト値を指定した引数は、呼び出し時に省略することができます。下記の例では、第2引数が省略された場合、$moneyは’円’となります。出力:1ドル?&gt;可変長引数PHPは、可変長引数をサポートしています。引数を可変長にするためには、関数定義では引数を定義しないで、呼び出し時に引数を渡すようにします。func_get_args()で渡された引数にアクセスします。func_num_args()は、渡された引数の数を返します。func_get_arg()は、引数のインデックスを指定することで、引数の要素を返します。その際、インデックスは0からになります。func_get_args()は、渡された引数を配列として返します。'a');?&gt;タイプヒンティングPHPでは、引数の型を指定することはできませんが、タイプヒンティングを使用することで、引数の型を配列や特定のクラスのオブジェクトに制限することができます。タイプヒンティングの指定は、下記のように関数の定義時に引数の前にarrayやクラス名を指定します。error*/?&gt;関数の戻り値(返り値)関数内でreturn文を使用することにより、呼び出し元に値を返すことができます。通常、returnによる戻り値は、参照ではなく値として返されます。returnにより呼び出し元に制御が戻るため、return以降の処理は実行されません。'return以降の処理は行われません。11?&gt;戻り値を参照で返したい場合は、関数名の先頭に&を付けます。その際、戻り値を変数に代入する場合は、代入演算子にも&を付ける必要があります。'return以降の処理は行われません。その名の通り名前のない関数です。無名関数は、下記のように変数に代入して使用したり、コールバック関数として使用します。無名関数はPHP5.3以降で使用可能です。}?&gt;クロージャクロージャを利用することで、関数内で使用できる変数を親スコープから引き継ぐことができます。親スコープの変数を引き継ぐためには、無名関数を定義する際にuse構文で使用する変数を指定します。下記の例では、$foo()によって返される関数の定義でuse構文を使用し、親スコープの$moneyを指定しています。結果として、内側の関数内から親スコープの$moneyにアクセスできることが確認できます。出力:1ドル?&gt;関数の呼び出しPHPでの基本的な関数の呼び出し方は、これまでの例で見てきたように関数名や無名関数を代入した変数に()を付けて呼び出します。それ以外にも関数を呼び出す方法がいくつか用意されています。可変関数PHPでは、関数名(文字列)の代入された変数に()を付けることにより、関数として呼び出すことができます。これを可変関数といいます。無名関数と同じように呼び出しますが、無名関数は変数に関数自体が代入されているのに対して、可変関数は変数に代入された文字列を識別子として関数を呼び出す点に違いがあります。出力:foo()?&gt;コールバック関数コールバック関数とは、呼び出した関数の処理で実行されるように登録しておく関数のことです。下記の例では、array_map()関数の引数で’foo’をコールバック関数として渡しています。結果、array_map()の処理で配列の各要素に対してfoo()が実行され、返された新しい配列が$result_arrayに代入されます。‘staticメソッド名’)、’クラス名::staticメソッド名’も渡すことができます。}?&gt;call_user_func()call_user_func()は、第1引数でコールバック関数を渡し、第2引数以降でコールバック関数に渡す引数を指定します。call_user_func()の第2引数以降で参照を渡すことは非推奨(将来廃止予定)のようです。出力:2ドル?&gt;call_user_func_array()call_user_func_array()は、第1引数でコールバック関数を渡し、第2引数でコールバック関数に渡す引数を配列で指定します。出力:2ドル?&gt;定義済み関数PHPには、拡張機能も含めて多くのビルトイン関数が存在します。関数が定義されているかを調べるには、function_exists()を使用します。function_exists()は、引数に文字列で渡した関数が定義されていればtrue、定義されていなければfalseを返します。出力:bool(false)?&gt;また、get_defined_functions()ですべての定義済み関数の関数名を配列で得ることができます。戻り値は連想配列になっており、’user’キーにユーザー定義関数の関数名、’internal’キーにビルトイン関数の関数名が配列で格納されています。