クロージャと '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行目には元の価格(小数点を含む可能性のある数値)が含まれます。
期待される出力: 割引適用後の最終価格
自分で試してみよう
<?php
// 入力を読み込む
$discount = floatval(fgets(STDIN));
$price = floatval(fgets(STDIN));
// TODO: 'use' を使用して割引率をキャプチャする無名関数を作成する
// この関数は価格をパラメータとして受け取り、割引後の最終価格を返す必要がある
// TODO: 価格を指定してクロージャを呼び出し、その結果を保存する
// 最終価格を出力する
echo $finalPrice;
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。