[ PHP ] 無名関数 use 構文でパラメータの値渡しと参照渡しの違い

Pocket

ここでは、無名関数の作成と無名関数の use 構文を使用したパラメータの事前バインディングと遅延バインディングの違いについて掲載しています。

スポンサーリンク

無名関数(クロージャ)

無名関数とは、その名の通り名前のない関数であり、PHP5.3.0 以降でサポートされています。以下は無名関数の作成と呼び出しを行うサンプルコードになります。詳細はサンプル内のコメントを参照ください。

/*
 * call_user_func() 関数を使用して無名関数の作成と呼び出しを
 * 一度に行う。ただし、以下の方法では関数の使い回しはできなない。
 */
$answer = call_user_func(function($n, $m) { return $n * $m; }, 6, 9);
// $answer : 54

// 無名関数自体を変数に代入
$multi = function($n, $m)
{
    return $n * $m;
};  // セミコロンが必要

$answer = $multi(6, 7);
// $answer : 42

/*
 * 一旦変数に入れた無名関数は使い回しが可能である。
 */
$answer = call_user_func($multi, 6, 9);

無名関数 use 構文でパラメータの受け渡し

use 構文を使用した無名関数へのパラメータの渡し方のサンプルになります。無名関数のパラメータを参照渡しとすることで、無名関数の作成時ではなく実行時にパラメータの値が確定していることがわかります。値渡し場合は関数の作成時にパラメータの値が確定しています。

値渡しで事前バインディング

$n = 8;
$m = 9;
$func = function () use ($n, $m) 
{
    return $n * $m;
};
$n = 1;
$m = 2;

// 無名関数の実行
$answer = $func();
// $answer : 72

参照渡しで遅延バインディング

$n = 8;
$m = 9;
$func = function () use (&$n, &$m) 
{
    return $n * $m;
};
$n = 1;
$m = 2;

// 無名関数の実行
$answer = $func();
// $answer : 2
参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *