Глобальные переменные в языке PHP: полное руководство

Раздел: PHP -> Переменные

Глобальные переменные в PHP: способы использования

Основное решение: ключевое слово global и массив $GLOBALS

Для доступа к глобальной переменной внутри функции следует объявить её через global. Это импортирует переменную из глобальной области в локальную.


    <?php
    $counter = 0;
    function increaseCounter() {
        global $counter;
        $counter++;
    }
    increaseCounter();
    echo $counter; // 1
    ?>
  

Index php global (глобальные переменные в php)

Второй способ - использование суперглобального массива $GLOBALS. Он содержит все глобальные переменные в виде ассоциативного массива.


    <?php
    $message = 'Привет';
    function showMessage() {
        echo $GLOBALS['message'];
    }
    showMessage(); // Привет
    ?>
  

Php записать в переменную (запись в переменную в php)

Цель: обеспечить чтение и изменение переменной, определённой вне функции, без передачи её аргументом.

Случаи использования: конфигурационные параметры, общие счётчики, данные, необходимые во многих функциях.

Варианты решения

Как сделать, чтобы функция могла изменять внешнюю переменную без использования global?

При передаче по ссылке (&) в аргументе функции изменение переменной внутри функции отражается на оригинале.


    <?php
    $value = 10;
    function multiplyByTwo(&$num) {
        $num *= 2;
    }
    multiplyByTwo($value);
    echo $value; // 20
    ?>
  

Цель: контролируемая модификация без глобального импорта.

Каким образом определить неизменяемые глобальные данные?

Константы (define или const) доступны в любой области видимости и не могут быть изменены.


    <?php
    define('SITE_EMAIL', 'admin@example.com');
    function getSupportEmail() {
        return SITE_EMAIL;
    }
    echo getSupportEmail();
    ?>
  

Цель: фиксация настроек, которые не должны меняться во время выполнения.

Как получить доступ к данным окружения (запрос, сервер, сессия) внутри функции?

Суперглобальные массивы ($_POST, $_GET, $_SERVER, $_SESSION) автоматически доступны в любой области видимости.


    <?php
    session_start();
    $_SESSION['user'] = 'Иван';
    function getUser() {
        return $_SESSION['user'] ?? 'гость';
    }
    echo getUser(); // Иван
    ?>
  

Цель: работа с данными HTTP-запроса, сессии, серверной информации.

Как сохранить значение переменной между вызовами функции без глобального контекста?

Статические переменные внутри функции сохраняют своё значение между вызовами, но видны только внутри функции.


    <?php
    function increment() {
        static $count = 0;
        $count++;
        return $count;
    }
    echo increment(); // 1
    echo increment(); // 2
    ?>
  

Цель: подсчёт вызовов, кеширование временных данных.

Как организовать глобальные данные для пользователя на разных страницах сайта?

Сессии позволяют хранить данные между HTTP-запросами одного пользователя. Для доступа достаточно вызвать session_start() и использовать $_SESSION.


    <?php
    session_start();
    $_SESSION['theme'] = 'dark';
    function getTheme() {
        return $_SESSION['theme'] ?? 'light';
    }
    ?>
  

Цель: аутентификация, корзина покупок, персональные настройки.

Типичные проблемы и ошибки

  • Забытый global внутри функции - PHP создаст локальную переменную с тем же именем, не изменяя глобальную. Решение: всегда проверять наличие global при необходимости доступа к внешней переменной.
  • Чрезмерное использование $GLOBALS - код становится трудночитаемым и сложным для отладки. Решение: ограничить количество глобальных переменных, предпочитать передачу параметров.
  • Конфликт имен: глобальная переменная может случайно перезаписаться внутри функции, если не используется global. Решение: применять чёткие соглашения об именовании (например, префикс g_).
  • Безопасность: глобальные переменные, доступные через global или $GLOBALS, могут быть изменены из любого места, что усложняет контроль данных. Решение: для критичных данных использовать константы или внедрение зависимостей.
  • Производительность: обращение к $GLOBALS медленнее, чем к локальным переменным. В циклах с интенсивными вызовами стоит копировать глобальное значение в локальную переменную.

Расширенные примеры работы с глобальными переменными

1. Пример с global и вложенными функциями

Показано, как global действует в цепочке вызовов.

Пример

<?php
$base = 100;

function outer() {
    global $base;
    $base += 50;

    function inner() {
        global $base;
        $base *= 2;
    }
    inner();
}

outer();
echo $base; // 300
?>
Результат: 300

Пояснение: global в outer() и inner() ссылается на одну и ту же переменную $base. Изменения накапливаются.

2. Использование $GLOBALS для динамического доступа

Можно обращаться к глобальным переменным по имени строки.

Пример

<?php
$name = 'Глобальная';
$varname = 'name';
echo $GLOBALS[$varname]; // Глобальная

function setGlobalFromArray($key, $value) {
    $GLOBALS[$key] = $value;
}
setGlobalFromArray('custom', 'новое значение');
echo $GLOBALS['custom']; // новое значение
?>
Глобальная
новое значение

3. Передача по ссылке с массивом

Изменение элементов массива через ссылку в функции.

Пример

<?php
$config = ['host' => 'localhost', 'port' => 3306];

function updateConfig(array &$cfg) {
    $cfg['port'] = 3307;
    $cfg['timeout'] = 30;
}

updateConfig($config);
print_r($config);
?>
Array
(
    [host] => localhost
    [port] => 3307
    [timeout] => 30
)

4. Константы и их отличие от глобальных переменных

Константы нельзя изменить, но они доступны везде. Сравнение с global.

Пример

<?php
define('TAX_RATE', 0.2);
$price = 100;

function totalWithTax() {
    global $price;
    return $price * (1 + TAX_RATE);
}

echo totalWithTax(); // 120
?>
120

Пояснение: TAX_RATE не требует объявления внутри функции, а $price требует global.

5. Статические переменные в рекурсивной функции

Сохранение состояния между вызовами без глобального контекста.

Пример

<?php
function factorial($n) {
    static $cache = [0 => 1, 1 => 1];
    if (!isset($cache[$n])) {
        $cache[$n] = $n * factorial($n - 1);
    }
    return $cache[$n];
}

echo factorial(5); // 120
echo factorial(6); // 720 (использует кеш)
?>
120
720

6. Сессии: управление глобальным состоянием пользователя

Сессия позволяет хранить данные между запросами. Пример с массивом корзины.

Пример

<?php
session_start();

// Добавление товара в корзину
function addToCart($productId, $quantity) {
    $_SESSION['cart'][$productId] = ($_SESSION['cart'][$productId] ?? 0) + $quantity;
}

// Получение корзины
function getCart() {
    return $_SESSION['cart'] ?? [];
}

addToCart(101, 2);
addToCart(102, 1);
print_r(getCart());
?>
Array
(
    [101] => 2
    [102] => 1
)

7. Использование $_SERVER для получения глобальной информации о запросе

Суперглобальный массив $_SERVER содержит данные о сервере и окружении.

Пример

<?php
function getRequestInfo() {
    $info = [
        'method' => $_SERVER['REQUEST_METHOD'],
        'uri'    => $_SERVER['REQUEST_URI'],
        'ip'     => $_SERVER['REMOTE_ADDR']
    ];
    return $info;
}

print_r(getRequestInfo());
?>
Array
(
    [method] => GET
    [uri] => /example.php
    [ip] => 127.0.0.1
)

8. Комбинирование global и статических переменных

Пример функции-счётчика, который также использует глобальный флаг.

Пример

<?php
$enabled = true;

function safeCounter() {
    global $enabled;
    static $counter = 0;
    if ($enabled) {
        $counter++;
    }
    return $counter;
}

echo safeCounter(); // 1
echo safeCounter(); // 2
$enabled = false;
echo safeCounter(); // 2 (не увеличивается)
?>
1
2
2

Глобальные переменные в PHP - comments

En
Index php global (php)