サーチ…


前書き

変数スコープとは、変数にアクセスできるコードの領域を指します。これは可視性とも呼ばれます。 PHPでは、スコープブロックは関数、クラス、およびアプリケーション全体で使用できるグローバルスコープによって定義されます。

ユーザー定義のグローバル変数

関数またはクラス以外のスコープはグローバルスコープです。 PHPスクリプトに( includeまたはrequireを使用して)別のスクリプトが含まれている場合、スコープは変わりません。スクリプトが関数またはクラスの外部に含まれる場合、グローバル変数は同じグローバルスコープに含まれますが、スクリプトが関数内に含まれている場合、インクルードされたスクリプトの変数は関数のスコープ内にあります。

関数またはクラスメソッドの範囲内で、 globalキーワードを使用して、アクセスユーザー定義のグローバル変数を作成することができます。

<?php

$amount_of_log_calls = 0;

function log_message($message) {
    // Accessing global variable from function scope
    // requires this explicit statement
    global $amount_of_log_calls;

    // This change to the global variable is permanent
    $amount_of_log_calls += 1;

    echo $message;
}

// When in the global scope, regular global variables can be used
// without explicitly stating 'global $variable;'
echo $amount_of_log_calls; // 0

log_message("First log message!");
echo $amount_of_log_calls; // 1

log_message("Second log message!");
echo $amount_of_log_calls; // 2

グローバルスコープから変数にアクセスするもう一つの方法は、特別なPHP定義の$ GLOBALS配列を使うことです。

$ GLOBALS配列は、グローバル変数の名前をキーとする連想配列であり、その変数の内容は配列要素の値です。 $ GLOBALSはどんなスコープにも存在することに注意してください。これは$ GLOBALSがスーパーグローバルであるためです。

つまり、 log_message()関数を次のように書き換えることができます。

function log_message($message) {
    // Access the global $amount_of_log_calls variable via the
    // $GLOBALS array. No need for 'global $GLOBALS;', since it
    // is a superglobal variable.
    $GLOBALS['amount_of_log_calls'] += 1;

    echo $messsage;
}

globalキーワードを使ってグローバル変数の値を取得することができるときに、なぜ$ GLOBALS配列を使うのか?主な理由は、 globalキーワードを使用して変数をスコープに持ち込むことです。同じ変数名をローカルスコープで再利用することはできません。

超大域変数

スーパーグローバル変数はPHPによって定義されており、 globalキーワードなしでどこからでも使用できます。

<?php

function getPostValue($key, $default = NULL) {
    // $_POST is a superglobal and can be used without
    // having to specify 'global $_POST;'
    if (isset($_POST[$key])) {
        return $_POST[$key];
    }

    return $default;
}

// retrieves $_POST['username']
echo getPostValue('username');

// retrieves $_POST['email'] and defaults to empty string
echo getPostValue('email', '');

静的プロパティと変数

public可視性で定義された静的クラスのプロパティは、機能的にはグローバル変数と同じです。それらは、クラスが定義されているどこからでもアクセスできます。

class SomeClass {
    public static int $counter = 0;
}

// The static $counter variable can be read/written from anywhere
// and doesn't require an instantiation of the class
SomeClass::$counter += 1;

関数は、独自のスコープ内で静的変数を定義することもできます。これらの静的変数は、関数スコープで定義された通常の変数とは異なり、複数の関数呼び出しによって保持されます。これは、シングルトンデザインパターンを実装する非常に簡単で簡単な方法です。

class Singleton {
    public static function getInstance() {
        // Static variable $instance is not deleted when the function ends
        static $instance;

        // Second call to this function will not get into the if-statement,
        // Because an instance of Singleton is now stored in the $instance
        // variable and is persisted through multiple calls
        if (!$instance) {
            // First call to this function will reach this line,
            // because the $instance has only been declared, not initialized
            $instance = new Singleton();
        }

        return $instance;

    }
}

$instance1 = Singleton::getInstance();
$instance2 = Singleton::getInstance();

// Comparing objects with the '===' operator checks whether they are
// the same instance. Will print 'true', because the static $instance
// variable in the getInstance() method is persisted through multiple calls
var_dump($instance1 === $instance2);


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow