Основные способы передачи переменных в приложениях PHP
Основной способ: передача переменной в функцию или метод
Как передать переменную в функцию и получить изменённое значение обратно?
Наиболее распространённый и рекомендованный способ взаимодействия между компонентами (функциями, методами классов) - это использование параметров. Переменная передаётся в вызове, а функция оперирует её копией (по умолчанию) или ссылкой (&).
Пример передачи по значению:
function double($num) {
$num *= 2;
return $num;
}
$value = 5;
$result = double($value);
echo $value; // 5 (оригинал не изменился)
echo $result; // 10
Пример передачи по ссылке:
function doubleRef(&$num) {
$num *= 2;
}
$value = 5;
doubleRef($value);
echo $value; // 10 (оригинал изменён)
- Забыть вернуть значение при передаче по значению - результат теряется.
- Передача по ссылке литерала (например, doubleRef(5)) - фатальная ошибка.
- Изменение переменной внутри функции без понимания, что это повлияет на внешний контекст.
Решение:
- Всегда возвращайте значение, если нужен результат.
- Используйте ссылки только когда это действительно необходимо, например, для больших массивов.
- Документируйте ожидаемое поведение.
Цель: обеспечить чёткий интерфейс между компонентами, избегая побочных эффектов или наоборот - изменяя внешние данные.
Как передать переменную между функциями без использования аргументов?
Можно объявить переменную глобальной с помощью ключевого слова global внутри функции.
$counter = 0;
function increment() {
global $counter;
$counter++;
}
increment();
echo $counter; // 1
Цель: быстрая передача данных в простых скриптах, но не рекомендуется для больших проектов.
Как передать переменную между разными PHP-скриптами через URL или форму?
Используйте массивы $_GET (для GET-запросов) и $_POST (для POST). В URL: page.php?param=value; в форме: <input name="param">.
// page.php?name=John
echo 'Привет, ' . htmlspecialchars($_GET['name']); // Привет, John
Цель: передача данных от клиента к серверу, создание динамических страниц.
Как сохранить переменную между запросами одного пользователя?
Сессии позволяют хранить данные на сервере, привязанные к пользователю через идентификатор. Используйте $_SESSION.
session_start();
$_SESSION['user_id'] = 42;
// на другой странице
session_start();
echo $_SESSION['user_id']; // 42
Цель: поддержка состояния пользователя (авторизация, корзина).
Как передать переменную из одного файла в другой через подключение?
При использовании include или require переменные из вызывающего скрипта становятся доступны в подключаемом файле.
// main.php
$theme = 'dark';
include 'footer.php';
// footer.php
echo "Текущая тема: $theme"; // Текущая тема: dark
Цель: простой обмен данными между частями одного запроса, удобно для шаблонов.
Дополнительные примеры и нестандартные ситуации
Передача по ссылке в анонимную функцию (замыкание)
В замыкании можно захватить внешнюю переменную по ссылке, чтобы изменения внутри замыкания отражались на оригинале.
$count = 0;
$closure = function() use (&$count) {
$count++;
};
$closure();
$closure();
echo $count; // 2
2
Именованные аргументы (PHP 8+)
Позволяют передавать значения, явно указывая имя параметра, что улучшает читаемость и позволяет пропускать необязательные параметры.
function createUser($name, $age, $role = 'user') {
return "Name: $name, Age: $age, Role: $role";
}
echo createUser(age: 30, name: 'Alice');
Name: Alice, Age: 30, Role: user
Переменное количество аргументов (...$args)
Функция может принимать произвольное число параметров, собранных в массив.
function sum(...$numbers) {
return array_sum($numbers);
}
echo sum(1,2,3,4);
10
Передача функции как аргумента (функции высшего порядка)
Позволяет передавать поведение в виде колбэка, например, для применения трансформаций.
function applyTwice($value, $callback) {
return $callback($callback($value));
}
$double = fn($x) => $x * 2;
echo applyTwice(5, $double); // 5*2=10, 10*2=20
20
Клонирование объекта при передаче
Объекты передаются по ссылке. Чтобы избежать изменения оригинала, используют clone.
class User {
public $name;
}
$original = new User();
$original->name = 'John';
function changeName($user) {
$user->name = 'Jane';
}
$copy = clone $original;
changeName($copy);
echo $original->name; // John
John
Использование $GLOBALS
Суперглобальный массив $GLOBALS содержит все глобальные переменные. Обращение к нему - один из способов доступа к переменным из любого места, но его применение считается устаревшей практикой.
$a = 10;
function show() {
echo $GLOBALS['a'];
}
show();
10
Типизированные параметры и объединённые типы
PHP 8+ позволяет задавать union-типы, что повышает надёжность кода.
function setStatus(int|string $status): void {
echo "Status: $status";
}
setStatus(200);
setStatus('OK');
Status: 200 Status: OK