## ユーザー定義関数

関数は、`function` キーワードと関数の名前、 カンマ(`,`) で区切ったパラメーターのリスト （空であっても構いません）を括弧で囲み、 関数の本体を波括弧で囲んだものを続けて定義します。 たとえば、以下のようになります:

例1 `foo` という名前の新しい関数を宣言する

    <?php
    function foo($arg_1, $arg_2, /* ..., */ $arg_n)
    {
        echo "関数の例\n";
        return $retval;
    }

> 注意:

> PHP 8.0.0 以降では、 パラメーターのリストの末尾に、カンマを付加できるようになっています:

>     <?php
>     function foo($arg_1, $arg_2,) { }

関数の本体の中では、 他の関数や クラス 定義を含む PHP のあらゆる有効なコードを使用することができます。

関数名は、PHP の他のラベルと同じ規則に従います。関数名として有効な 形式は、まず文字かアンダースコアで始まり、その後に任意の数の文字・ 数字・あるいはアンダースコアが続くものです。正規表現で表すと、 `^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$` となります。

ヒント

ユーザーレベルでの命名の手引き も参照ください。

PHP では、関数は参照される前に定義されている必要はありません。 ただし以下の二つの例のように、条件付きで関数が 定義されるような場合を除きます。

次の二つの例のように、ある条件下でのみ関数が定義される場合には、 その関数定義は関数がコールされる前に 行われていなければなりません。

例2 条件つきの関数

    <?php
    $makefoo = true;

    /* ここでは関数foo()はまだ定義されていないので
       コールすることはできません。
       しかし関数 bar()はコールできます。 */
    if (function_exists('foo')) {
        foo();
    } else {
        echo "Function foo does not exist (yet).\n";
    }

    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 関数の中の関数

    <?php
    function foo()
    {
      function bar()
      {
        echo "I don't exist until foo() is called.\n";
      }
    }

    /* ここでは関数bar()はまだ定義されていないので
       コールすることはできません。 */
    if (function_exists('bar')) {
        bar();
    }

    foo();

    /* foo()の実行によって bar()が
       定義されるためここではbar()を
       コールすることができます。*/

    bar();

PHP では、関数やクラスはすべてグローバルスコープにあります - 関数の内部で定義したものであっても関数の外部からコールできますし、 その逆も可能です。

PHP は関数のオーバーロードをサポートしていません。 また、宣言された関数の定義を取り消したり再定義することも できません。

> 注意: 関数名は ASCII 文字 `A` から `Z` で構成されている場合、 大文字小文字を区別しませんが、 通常は関数宣言時と同じ名前で関数をコールする方が好ましいです。

可変引数 および デフォルト引数 の機能をサポートしています。 func_num_args(), func_get_arg(), func_get_args() に関する関数リファレンスを 参照ください。

PHP では、関数を再帰的にコールすることが可能です。

例4 再帰的な関数

    <?php
    function recursion($a)
    {
        if ($a < 20) {
            echo "$a\n";
            recursion($a + 1);
        }
    }

    recursion(17);

> 注意: 100 から 200 を超えるようなレベルの再帰呼び出しは避けてください。そんなことをすると、 スタックが破壊され、スクリプトが異常終了してしまいます。 無限に続くような再帰処理は、プログラミングの間違いでしょう。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open