クロージャと 'use'
CoddyのPHPジャーニー「論理とフロー」セクションの一部 — レッスン 2/68。
デフォルトでは、匿名関数はパラメータとして渡された変数にしかアクセスできません。しかし、クロージャが周囲のスコープの変数にアクセスする必要がある場合はどうすればよいでしょうか?そこで use キーワードの出番です。
use キーワードを使用すると、クロージャが親スコープから変数を「キャプチャ」して、関数内で使用できるようになります:
<?php
$message = "Welcome";
$greeting = function($name) use ($message) {
echo $message . ", " . $name . "!";
};
$greeting("Bob"); // 出力: Welcome, Bob!
?>$message が関数の外で定義されていることに注目してください。しかし、パラメータリストの後に use ($message) を含めることで、クロージャはその変数にアクセスして使用することができます。カンマで区切ることで、複数の変数をキャプチャできます:use ($var1, $var2)。
この機能はクロージャをより強力なものにし、無名関数の柔軟性を維持しつつ、周囲のコンテキストからのデータを扱えるようにします。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単use キーワードを使用して、周囲のスコープから割引率をキャプチャする無名関数を作成してください。この関数は引数として価格を受け取り、割引を適用した後の最終価格を返す必要があります。
割引率と元の価格の2つの入力を受け取ります。両方の入力を読み込み、割引率をキャプチャするクロージャを作成し、そのクロージャを価格を引数にして呼び出し、割引後の最終価格を出力してください。
入力形式: 2行 - 1行目には割引率(数値)、2行目には元の価格(小数を含む可能性のある数値)が含まれます。
期待される出力: 割引適用後の最終価格
チートシート
use キーワードを使用すると、クロージャが親スコープから変数をキャプチャできるようになります。
<?php
$message = "Welcome";
$greeting = function($name) use ($message) {
echo $message . ", " . $name . "!";
};
$greeting("Bob"); // 出力: Welcome, Bob!
?>カンマで区切ることで、複数の変数をキャプチャできます:use ($var1, $var2)。
自分で試してみよう
<?php
// 入力を読み込む
$discount = floatval(fgets(STDIN));
$price = floatval(fgets(STDIN));
// TODO: 'use' を使用して割引率をキャプチャする無名関数を作成する
// この関数は価格をパラメータとして受け取り、割引後の最終価格を返す必要があります
// TODO: 価格を指定してクロージャを呼び出し、結果を保存する
// 最終価格を出力する
echo $finalPrice;
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。