ほとんどのプログラミング言語のスコープルールに従って、それらの内部の関数の外側で定義された変数にアクセスできますが、なぜこのコードが機能しないのですか?
<?php
$data = 'My data';
function menugen(){
echo "[".$data."]";
}
menugen();
?>
出力には[]
があります。
アクセスするグローバル変数を宣言する必要があるため
$data = 'My data';
function menugen() {
global $data; // <-- add this line
echo "[".$data."]";
}
menugen();
それ以外の場合は、$GLOBALS['data']
としてアクセスできます。 http://php.net/manual/en/language.variables.scope.php を参照してください
少しOTであっても、グローバルをまったく使用せず、パラメーターとして渡すことをお勧めします。
次のいずれかを実行できます。
<?php
$data='My data';
function menugen(){
global $data;
echo "[".$data."]";
}
menugen();
または
<?php
$data='My data';
function menugen(){
echo "[".$GLOBALS['data']."]";
}
menugen();
そうは言っても、グローバルを使いすぎるとコードの品質が低下する可能性があります。通常、必要なものを渡すことをお勧めします。たとえば、グローバルデータベースオブジェクトを参照する代わりに、データベースへのハンドルを渡し、それに基づいて動作する必要があります。これは、依存性注入と呼ばれます。自動化されたテストを実装すると、人生がずっと楽になります(これが必要です)。
それは範囲の問題です。要するに、グローバル変数は避けるべきですSO:
パラメータとして渡す必要があります。
$data = 'My data';
function menugen($data)
{
echo $data;
}
または、クラスに入れてアクセスする
class MyClass
{
private $data = "";
function menugen()
{
echo this->data;
}
}
編集:@MatteoTassinariの回答を参照し、アクセスするためにグローバルとしてマークすることができますが、グローバル変数は通常必要ないため、コーディングを再考するのが賢明です。
別の方法:
<?php
$data = 'My data';
$menugen = function() use ($data) {
echo "[".$data."]";
};
$menugen();
必要に応じて、「定義」関数を使用できますが、この関数は、一度定義すると変更できない定数を作成します。
<?php
define("GREETING", "Welcome to W3Schools.com!");
function myTest() {
echo GREETING;
}
myTest();
?>
長年、私は常にこの形式を使用してきました。
<?php
$data = "Hello";
function sayHello(){
echo $GLOBALS["data"];
}
sayHello();
?>
わかりやすく、簡単に理解できます。 $ GLOBALは、PHPを使用してグローバル変数を参照する方法です。 $ _SERVER、$ _ POSTなどのようなものを使用している場合、知らないうちにグローバル変数を参照している
関数に変数を渡す必要があります。
$data = 'My data';
function menugen($data)
{
echo $data;
}