Поиск…


Вступление

Область переменной относится к областям кода, к которым доступна доступная переменная. Это также называется видимостью . Блоки видимости 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;
}

Можно спросить, зачем использовать массив $ GLOBALS, когда global ключевое слово также может использоваться для получения значения глобальной переменной? Основная причина заключается в том, что использование ключевого слова 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;

Функции также могут определять статические переменные внутри своей области. Эти статические переменные сохраняются с помощью множества вызовов функций, в отличие от обычных переменных, определенных в области функций. Это может быть очень простой и простой способ реализации шаблона проектирования Singleton:

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