ITHACK
~ みんなのIT部門 ~

【PHP】function use – 無名関数(クロージャー)で親スコープの変数を利用する

ここでは無名関数で親スコープの変数を使う方法について解説します。

  • 無名関数で親スコープの変数を利用する方法

無名関数のスコープ

無名関数に外部から値を与える方法は2つあり、1つは引数で受け取る場合です。
※ グローバル変数は使えます。

もう1つは、useキーワードを使った方法です。
useキーワードを使うと、親スコープの変数を無名関数で使うことができるようになります。

基本構文

useキーワードを使ったの無名関数の基本構文は次のようになります。

function( $引数名 ) use ( $親スコープの変数名 ) {
    // 処理・・・・・
}

サンプルコード

useキーワードを使った無名関数のサンプルコードをご覧ください。

<?php

$z = 8;

$addition = function( $x, $y ) use ( $z ) {
    return $x + $y + $z;
};

echo $addition(3, 5)."\n";

?>
16

このコードの解説は次の表の通りです。

行数 概要
3 変数$zを用意し、8を代入。
5~7 足し算する無名関数を$additionに代入。また、useで親スコープの$zを使用することを宣言。
9 $additionの無名関数を実行し、出力。

5行目のuse ( $z )で親スコープの変数を無名関数で使うことを宣言しています。
そのため、無名関数で$zを使用しても正常に動作します。

演習問題

問題1

会計の合計金額を計算するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 合計金額の計算式は『単価×個数+消費税』とする
  • 単価と個数は標準入力で与える
  • 消費税の税率は10%とする
  • 合計金額を計算する処理は無名関数で行う(変数に記憶しておく)
  • 消費税率は無名関数にuseキーワードで与える
$ php practice.php
単価 > 100
個数 > 5
合計料金 : 550円
$ php practice.php
単価 > 1800
個数 > 7
合計料金 : 13860円

問題2

一定値以上の複数数値の一覧と合計値を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 複数数値は標準入力で与える(空文字が入力されるまで)
  • 一定値は標準入力で与える
  • 複数数値の一覧を出力する処理を行う無名関数を作成する
    ※ 一定値はuseキーワードで与える
  • 複数数値の合計値を戻り値として返す処理を行う無名関数を作成する
    ※ 一定値はuseキーワードで与える
  • execute関数を下記の次の仕様で作成する
    引数: 複数数値、クロージャー
    処理: クロージャーを呼び出し、引数に複数数値を与える
$ php practice.php
=== Input Number     ===
> 123
> 456
> 789
> 
=== Input Min Number ===
> 400
=== Closure          ===
456
789
total : 1245
$ php practice.php
=== Input Number     ===
> 1234
> 3456
> 5678
> 7890
> 
=== Input Min Number ===
> 3000
=== Closure          ===
3456
5678
7890
total : 17024

まとめ

無名関数で親スコープの変数を使う場合は、useキーワードを使用します。

引数を1つ増やして値を与える方法もありますが、第三者が作成したプログラムの場合、無名関数の引数が決まっている場合もあるので、その際はこちらの方法を使った方が良いでしょう。