Глобальные переменные в языке 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