関数

関数情報

function_exists('array'); //この名前の関数が定義されていれば真を返す

//定義されている関数名を取得
$list = get_defined_functions();
var_dump($list);
// 組み込み関数や拡張機能の関数は 'internal' 内に
// ユーザ定義関数は 'user' 内の配列にセットされる

引数

引数の初期値

  • 引数の後に = で区切った初期値を与えることができる。
    これは定数値のみである。
    初期値を与えた引数は呼び出し時に省略できる。
    func(TRUE);	//true
    func();		//false
    function func($flag=FALSE){
    	echo ($flag ? 'true' : 'false'),PHP_EOL;
    }
  • 初期値を定義した引数は、初期値のない引数の後につけてはいけない。
    必ず先に「初期値なし」後に「初期値あり」の順に定義すること。
    一応実行はされるようだが、Warning が出る。
    // ダメ
    function func($flag=FALSE,$value){
    }
    
    // OK
    function func($value,$flag=FALSE){
    }

引数の参照

引数の前に & を付けるとその引数は参照渡しとなる。
変数の値ではなく変数の場所を示すアドレスのようなものを与えることで
global 指定していない関数外の変数にもアクセスできる。

$x = 10;
echo "add_num ----\n";
echo "before :".$x,PHP_EOL;
add_num($x);
echo "after  :".$x,PHP_EOL;

echo "add_ref ----\n";
echo "before :".$x,PHP_EOL;
add_ref($x);
echo "after  :".$x,PHP_EOL;

//変数を1加算する
function add_num($value){
	$value++;
}
//参照先の変数を1加算する
function add_ref(&$value){
	$value++;
}
  • 実行結果
    add_refの実行後は外部変数 $x の内容も書き換わっている。
    add_num ----
    before :10
    after  :10
    add_ref ----
    before :10
    after  :11

可変引数の取得

  • 引数の数が変動するものも取得可能。
    //引数の順番は 0 オリジン
    function func(){
    	// 引数の数
    	$num = func_num_args()
    
    	// すべての引数配列
    	$params = func_get_args()
    
    	// 指定した番号の引数の要素
    	$param = func_get_arg(1);
    }

可変関数

func_caller('test');

function test(){
	echo "test function",PHP_EOL;
}
function func_caller($name){
	if( function_exists($name) ){	//指定名の関数があればコールする
		return $name();
	}
	echo "function:".$name." is not found.",PHP_EOL;
	return FALSE;
}
  • strtolowerを可変変数で呼び出す
    $func = 'strtolower';
    echo $func('ABC'); //abc

コールバック関数

//指定した名前の関数を配列毎に実行する
$array = array_map('strtolower',array('Abc','DEF','gh'));
var_dump($array); // abc,def,gh

コールバック関数には既存の組み込み関数、ユーザ定義関数、create_functionで受け取った関数名文字列、
無名関数で生成したクロージャオブジェクトが使えます。

匿名関数 <v.4.0.1以降>

create_function
ユニークな名前の関数(ラムダ形式)を生成し、その関数名を返す。コールバック関数に利用可能。
引数文字列とコード文字列はシングルクオートで囲んで指定する「べき」。
$func = create_function( '$arg1,$arg2', 'return ($arg1+$arg2);' );
echo '$func(3,1)='.$func(3,1),PHP_EOL; // =4
echo '$func=0x'.bin2hex($func),PHP_EOL; // "\0lambda_1" が入っている

//名前法則がわかっていれば匿名関数 $func の内容を知らなくても呼び出せてしまう
$func2 = "\0lambda_1";
echo '$func2(3,1)='.$func2(3,1),PHP_EOL; // =4
匿名関数はあくまでコール時に重複しない関数名を生成しているに過ぎない。
上記のように匿名関数を探して実行できてしまう。
また、シングルクオートを用いたコードは可読性に欠けるため古いバージョン以外では使うべきではない。
とはいえ、未だにphp4のままのサーバもあるのでその場合は仕方ない。

無名関数(クロージャ) <v5.3.0以降>

  • php 5.3.0 以降では無名関数(クロージャ)をコールバック関数として使えます。
    これは Closier クラスを持つオブジェクトです。
    array_map などの中に直接記述すると便利である。
  • create_function という古い匿名関数があるが、これはシングルクオートの制約もあり 可読性が低く
    無名ではなく自動でユニークな名前の関数を生成しているに過ぎない。
    古いバージョンの php を除いて 古い create_function 関数は使うべきではない。
    今は同様の手順をもっと簡単に複数行に渡って書ける無名関数を使うべきである。
//無名関数定義。末尾にセミコロン必要
//この関数を示すClosureクラスオブジェクトを返す
$obj = function ($v){ return $v*2; };

//旧仕様の create_function での匿名関数定義
//$vを変数展開しないためにシングルクオートで囲む
//この関数を示すユニークな名前文字列を返す
$func_name = create_function('$v','return $v*2;');
  • 使用例。usort関数で要素の英数字の全角半角・大文字小文字を同一視したソートを行う
    // 内部処理エンコードをソースに合わせるか
    // mb_convert_kana($a,'a','SJIS') のように使用エンコードを明示しないとうまくいかない
    $arr = array('bc','DEF','ABC','z','X','Y');
    sort($arr);
    var_dump($arr);	//DEF,Y,bc,z,ABC,X
    
    usort($arr,
    	function ($a,$b){	//無名関数。全角英数字を半角小文字にして比較する
    		$a = strtolower(mb_convert_kana($a,'a'));
    		$b = strtolower(mb_convert_kana($b,'a'));
    		if( $a == $b )	return 0;
    		return ( $a > $b ? 1 : -1);
    	}
    );
    var_dump($arr);	//ABC,bc,DEF,X,Y,z

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規新規下位 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-09-07 (水) 10:16:47 (2209d)