自分なりに調べて試してみた結果、下記の内容で自己解決しました。
また、PHPマニュアルにある変数のスコープの例にある変数$aと$bは、明記されていないだけでグローバル宣言がされているものと解釈する事にしました。
1. グローバル宣言した変数を参照
lang
1global $success, $failure; // この変数をグローバル変数にするという宣言
2$success = 'Yes!';
3$failure = 'Sorry...';
4
5function please_marry_me( $result=true ) {
6 global $success, $failure; // ローカル変数ではなくグローバル変数を使うという指示
7 $reaction;
8 if ( $result === true ) {
9 $reaction = '<p>' . $success . '</p>';
10 } elseif ( $result === false ) {
11 $reaction = '<p>' . $failure . '</p>';
12 } else {
13 $reaction = '<p>Please enter a true or false.</p>';
14 }
15 return $reaction;
16}
17
18echo please_marry_me( true );
2. クロージャ(無名関数)による変数の引き継ぎ
lang
1/*
2 * 引き継がれた変数の値は関数を定義した時点のもの
3 * 引き継がれた変数の値は関数の中では変更可能(関数の外にある変数には反映されない)
4 * 参照渡し(&$success)で引き継ぐと、関数を定義した後で変更した変数の値が呼び出した関数に反映される
5 * クロージャを変数に代入しているので上書きされるとクロージャを呼び出せなくなる
6 */
7$success = 'Yes!';
8$failure = 'Sorry...';
9
10$please_marry_me = function( $result=true ) use ( $success, $failure ) {
11 $reaction;
12 if ( $result === true ) {
13 $reaction = '<p>' . $success . '</p>';
14 } elseif ( $result === false ) {
15 $reaction = '<p>' . $failure . '</p>';
16 } else {
17 $reaction = '<p>Please enter a true or false.</p>';
18 }
19 return $reaction;
20}; // 変数なのでセミコロンの入れ忘れに要注意
21
22$success = 'Yes, of course!';
23echo $success; // Yes of course!
24echo $please_marry_me( true ); // Yes!
3. $GLOBALS(スーパーグローバル)による変数の参照
lang
1global $success, $failure; // グローバル宣言は必要
2$success = 'Yes!';
3$failure = 'Sorry...';
4
5function please_marry_me( $result=true ) {
6 $reaction;
7 if ( $result === true ) {
8 $reaction = '<p>' . $GLOBALS['success'] . '</p>';
9 } elseif ( $result === false ) {
10 $reaction = '<p>' . $GLOBALS['failure'] . '</p>';
11 } else {
12 $reaction = '<p>Please enter a true or false.</p>';
13 }
14 return $reaction;
15}
16
17echo please_marry_me( true );
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。