web-dev-qa-db-ja.com

PHP関数のグローバル変数にアクセスします

ほとんどのプログラミング言語のスコープルールに従って、それらの内部の関数の外側で定義された変数にアクセスできますが、なぜこのコードが機能しないのですか?

<?php
$data = 'My data';

function menugen(){   
    echo "[".$data."]";
}

menugen();
?>

出力には[]があります。

70

アクセスするグローバル変数を宣言する必要があるため

$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であっても、グローバルをまったく使用せず、パラメーターとして渡すことをお勧めします。

136

次のいずれかを実行できます。

<?php
$data='My data';
function menugen(){
    global $data;
    echo "[".$data."]";
}
menugen();

または

<?php
$data='My data';
function menugen(){
    echo "[".$GLOBALS['data']."]";
}
menugen();

そうは言っても、グローバルを使いすぎるとコードの品質が低下する可能性があります。通常、必要なものを渡すことをお勧めします。たとえば、グローバルデータベースオブジェクトを参照する代わりに、データベースへのハンドルを渡し、それに基づいて動作する必要があります。これは、依存性注入と呼ばれます。自動化されたテストを実装すると、人生がずっと楽になります(これが必要です)。

15
jcbwlkr

それは範囲の問題です。要するに、グローバル変数は避けるべきですSO:

パラメータとして渡す必要があります。

$data = 'My data';

function menugen($data)
{
    echo $data;
}

または、クラスに入れてアクセスする

class MyClass
{
    private $data = "";

    function menugen()
    {
        echo this->data;
    }

}

編集:@MatteoTassinariの回答を参照し、アクセスするためにグローバルとしてマークすることができますが、グローバル変数は通常必要ないため、コーディングを再考するのが賢明です。

10
webnoob

別の方法:

<?php

$data = 'My data';

$menugen = function() use ($data) {

    echo "[".$data."]";
};

$menugen();
7
donvercety

必要に応じて、「定義」関数を使用できますが、この関数は、一度定義すると変更できない定数を作成します。

<?php
define("GREETING", "Welcome to W3Schools.com!");

function myTest() {
    echo GREETING;
}

myTest();
?>

http://www.w3schools.com/php/php_constants.asp

0

長年、私は常にこの形式を使用してきました。

   <?php
     $data = "Hello";

     function sayHello(){
       echo $GLOBALS["data"];
     }

    sayHello();

   ?>

わかりやすく、簡単に理解できます。 $ GLOBALは、PHPを使用してグローバル変数を参照する方法です。 $ _SERVER、$ _ POSTなどのようなものを使用している場合、知らないうちにグローバル変数を参照している

0
Psalms Kalu

関数に変数を渡す必要があります。

$data = 'My data';

function menugen($data)
{
    echo $data;
}
0