Как в PHP передаются аргументы в функцию?

«Как в PHP передаются аргументы в функцию?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В PHP механизм передачи аргументов зависит от типа данных.

1. Простые типы (скаляры, массивы) передаются по значению (by value)

Создаётся копия значения переменной. Изменения внутри функции не влияют на оригинальную переменную.

function increment($number) {
    $number++; // Работает с копией
    echo "Inside function: $numbern"; // Выведет 6
}

$originalNumber = 5;
increment($originalNumber);
echo "Outside function: $originalNumbern"; // Выведет 5 (не изменилась)

2. Передача по ссылке (by reference)

Используя амперсанд (&) в объявлении параметра, функция получает ссылку на оригинальную переменную. Изменения внутри функции влияют на неё.

function incrementByReference(&$number) {
    $number++; // Работает с оригинальной переменной
}

$originalNumber = 5;
incrementByReference($originalNumber);
echo $originalNumber; // Выведет 6

3. Объекты передаются по ссылке на объект (object reference)

Начиная с PHP 5, объекты всегда передаются по ссылке на сам объект (формально — передаётся копия хэндла, указывающего на тот же объект).

class User {
    public $name = 'Alice';
}

function renameUser($userObject) {
    // Изменение свойств объекта видно снаружи
    $userObject->name = 'Bob';
}

$user = new User();
echo $user->name; // 'Alice'
renameUser($user); // Объект не клонируется
echo $user->name; // 'Bob' (имя изменилось)

Важное замечание: Если внутри функции переменной с объектом присвоить новый объект, оригинальная переменная снаружи не изменится, так как ссылка перезаписывается только в локальной области видимости.

function replaceUser($userObject) {
    $userObject = new User(); // Локальная ссылка теперь на новый объект
    $userObject->name = 'Charlie';
}

$user = new User();
$user->name = 'Alice';
replaceUser($user);
echo $user->name; // Останется 'Alice', а не 'Charlie'