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

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

Ответ

Нет, по умолчанию аргументы передаются по значению. Это базовое поведение PHP для скалярных типов (int, string, bool, float) и массивов. Функция получает копию значения, и работа ведется с этой копией.

Демонстрация передачи по значению:

function tryToChange($array) {
    $array[] = 'new element';
    // $array теперь локальная копия, оригинальный массив не изменился
}

$myArray = [1, 2, 3];
tryToChange($myArray);
print_r($myArray); // Выведет Array ( [0] => 1 [1] => 2 [2] => 3 )

Чтобы передать аргумент по ссылке, нужно использовать оператор & в сигнатуре функции:

function actuallyChange(&$array) {
    $array[] = 'new element';
}

$myArray = [1, 2, 3];
actuallyChange($myArray);
print_r($myArray); // Выведет Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 'new element' )

Поведение объектов: Объекты передаются по ссылке по умолчанию (начиная с PHP 5). Хотя формально в функцию передается копия дескриптора объекта, эта копия указывает на тот же экземпляр в памяти, поэтому изменения свойств объекта внутри функции сохраняются.

$object = new stdClass();
$object->data = 'original';

function modify($obj) {
    $obj->data = 'modified'; // Меняет свойство исходного объекта
}

modify($object);
echo $object->data; // Выведет 'modified'