Передаются ли аргументы в PHP по умолчанию по значению или по ссылке?

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

Ответ

По умолчанию аргументы передаются по значению. Это означает, что функция работает с копией переданного значения. Изменения этой копии внутри функции не затрагивают оригинальную переменную.

Пример передачи по значению:

function increment($number) {
    $number++;
    echo "Внутри функции: $numbern"; // Выведет 6
}

$originalValue = 5;
increment($originalValue);
echo "Снаружи: $originalValuen"; // Выведет 5 (оригинал не изменился)

Для передачи по ссылке необходимо явно указать амперсанд (&) перед параметром в объявлении функции:

function incrementByReference(&$number) {
    $number++;
}

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

Особый случай — объекты: Начиная с PHP 5, объекты передаются по ссылке неявно. Технически это называется "передача дескриптора объекта по значению", но на практике поведение аналогично передаче по ссылке: изменения свойств объекта внутри функции видны снаружи.

class MyClass {
    public $property = 1;
}

function modifyObject($obj) {
    $obj->property = 2; // Изменяется свойство того же объекта
}

$instance = new MyClass();
modifyObject($instance);
echo $instance->property; // Выведет 2