ほとんどのプログラミング言語のスコープルールによると、関数の外側で定義された変数にアクセスできますが、なぜこのコードが機能しないのですか?関数内のPHPアクセスグローバル変数
<?php
$data='My data';
function menugen(){
echo "[".$data."]";
}
menugen();
?>
出力で[]があります。
ほとんどのプログラミング言語のスコープルールによると、関数の外側で定義された変数にアクセスできますが、なぜこのコードが機能しないのですか?関数内のPHPアクセスグローバル変数
<?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
少しでもお使いになることをお勧めしますグローバルではなく、パラメータとして渡すことをお勧めします。
ありがとうございます、あなたは正しいですが、マニュアルの2番目の例ではこの行を使用しませんでした:http://php.net/manual/en/language.variables.scope.php –
実際には、読者は何をしないのですか? 'echoステートメントが$ a変数のローカルバージョンを参照し、このスコープ内に値が割り当てられていないため、このスクリプトは出力を生成しません。 ' –
Dang!私はこの答えをupvoteにログインしなければならなかったのは、PHP変数のスコープを忘れてしまったからです。 –
あなたが関数に変数を渡す必要があります:
$data = 'My data';
function menugen($data)
{
echo $data;
}
これは範囲の問題です。要するに、グローバル変数はSO避けるべきである。
あなたのいずれかをパラメータとして渡す必要があります。
$data = 'My data';
function menugen($data)
{
echo $data;
}
やクラスでそれを持っていると
class MyClass
{
private $data = "";
function menugen()
{
echo this->data;
}
}
それにアクセス編集:参照してください。 @MatteoTassinariの答えと同様に、それをグローバルにアクセスするためにマークすることができますが、グローバル変数は一般的には必要ではありませんので、コーディングを再考することが賢明でしょう。
次のいずれかを行うことができます
<?php
$data='My data';
function menugen(){
global $data;
echo "[".$data."]";
}
menugen();
それとも
言われていること<?php
$data='My data';
function menugen(){
echo "[".$GLOBALS['data']."]";
}
menugen();
は、グローバルの乱用は、いくつかの貧しい人々のコードにつながることができます。通常、必要なものを渡す方が良いです。たとえば、グローバルデータベースオブジェクトを参照する代わりに、データベースへのハンドルを渡し、それに基づいて処理する必要があります。これはDependency Injectionと呼ばれます。自動テストを実装すると、あなたの人生がずっと楽になります。それを行うには
別の方法:
<?php
$data = 'My data';
$menugen = function() use ($data) {
echo "[".$data."]";
};
$menugen();
あなたが「定義」機能を使用することができますが、この関数は一度定義を変更することはできません定数を作成したい場合。
<?php
define("GREETING", "Welcome to W3Schools.com!");
function myTest() {
echo GREETING;
}
myTest();
?>
マニュアルは、このようなことを言うん引数 –
としての機能に渡し、グローバルとして扱いしないでください? – deceze
関連する読者:[関数内のPHPグローバル](http://stackoverflow.com/q/5166087/1409082) – Jocelyn