関数

ユーザー定義関数 (User-defined functions)

function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
    echo "Example function.\n";
    return $retval;
}
PHP: ユーザー定義関数 - Manual

命名規則

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

PHP: ユーザー定義関数 - Manual
PHP: ルール - Manual

関数定義時のエラー

関数の定義でFatal error: Cannot redeclare xx()とエラーとなったときには、すでに同名の関数が定義されています。その関数名に心当たりがあるならば、素直に名前を変更します。思い当たるふしがないならば、include()しているファイルを調べてみます。

無名関数 (Anonymous functions) / クロージャ (closures)

// 関数の定義
$Foo = function( $a )
{
    echo $a;
}; // <- セミコロンが必要

// 関数の呼び出し
$Foo( 'ABC' );

create_function

string create_function ( string $args, string $code )
PHP: create_function - Manual

たとえばset_error_handler()のハンドラを無名関数にするならば、

set_error_handler( create_function( '$errno, $errstr', 'echo $errstr; return true;' ) );

のようにします。

コールバック (Callbacks)

関数の名前を文字列で渡すことで、その文字列から関数を呼び出せます。

function Foo( $a )
{
    echo $a;
}

function Bar( $func, $val )
{
    $func( $val );
    // Foo( 'ABC' )の呼び出し
}

Bar( 'Foo', 'ABC' );

再帰関数 (Recursive function)

再帰的に関数を呼び出すことが可能ですが、その深さには制限があります。ドキュメントには、

PHP では、関数を再帰的にコールすることが可能です。ただし、100 から 200 を超えるような再帰呼び出しは避けてください。そんなことをすると、 スタックが破壊され、スクリプトが異常終了してしまいます。

PHP: ユーザー定義関数 - Manual

とあります。試しに、

function Foo()
{
    Foo();
}
Foo();

としてループさせると、Fatal error: Maximum function nesting level of '100' reached, aborting!として、100回でスクリプトが停止します。

XDebugがインストールされているならば、再帰の深さを制御できます。設定オプションxdebug.max_nesting_levelの値がそれです。たとえば、

ini_set( 'xdebug.max_nesting_level', 500 );

として再度実行すると、Maximum function nesting level of '500' reached, aborting!となり、設定した深さまで処理を確認できます。