質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

16059閲覧

[PHP] 関数の外部にある変数を参照する方法

flat

総合スコア617

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/06/11 13:08

編集2015/06/29 05:57

関数の外にある変数を利用する方法はどの様なものがありますか?

PHPマニュアルにある変数のスコープの例を試してみたのですが、関数内で外部の変数($a,$b)を参照出来ませんでした。
関数の外部でもグローバル宣言をすると参照出来るようになりましたが、これは関数の内部だけの宣言では参照出来ないという事なのでしょうか?

PHPマニュアルにある変数のスコープの例(一部変更)

lang

1$a = 1; 2$b = 2; 3 4function Sum() { 5 global $a, $b; 6 var_dump( $a, $b ); // $a と $b どちらも NULL (参照できていない) 7 8 $b = $a + $b; 9} 10 11var_dump( Sum() ); // NULL 12echo $b; // 2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自分なりに調べて試してみた結果、下記の内容で自己解決しました。

また、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 );

投稿2015/06/12 15:27

編集2015/06/29 06:12
flat

総合スコア617

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問