Ответ
Нет, по умолчанию аргументы передаются по значению. Это базовое поведение 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'