Основные способы передачи переменных в приложениях PHP

Раздел: Основы 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
  
Ошибки: не проверять наличие ключа (isset), не экранировать вывод (XSS), доверять данным.

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

Как сохранить переменную между запросами одного пользователя?

Сессии позволяют хранить данные на сервере, привязанные к пользователю через идентификатор. Используйте $_SESSION.


session_start();
$_SESSION['user_id'] = 42;
// на другой странице
session_start();
echo $_SESSION['user_id']; // 42
  
Частая ошибка: забыть вызвать session_start() перед чтением/записью.

Цель: поддержка состояния пользователя (авторизация, корзина).

Как передать переменную из одного файла в другой через подключение?

При использовании 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
- Php передать переменную (передача переменной в php)

Передача переменной в PHP - comments

En
Php передать переменную (php)