← Назад к вопросам

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

1.0 Junior🔥 121 комментариев
#PHP Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Краткий ответ

Да, в языке PHP аргументы по умолчанию всегда передаются по значению (by value). Это означает, что при вызове функции создается локальная копия каждого аргумента внутри ее области видимости, и работа ведется с этой копией, а не с оригинальной переменной. Изменения, внесенные в параметр внутри функции, не затрагивают оригинальную переменную за ее пределами.

Подробное объяснение

1. Механизм передачи по значению (Pass by Value)

Это стандартное и наиболее часто используемое поведение PHP. Рассмотрим на примере:

<?php
function modifyValue($number) {
    $number = $number * 2;
    echo "Внутри функции: $number\n";
}

$originalNumber = 5;
modifyValue($originalNumber);
echo "Вне функции: $originalNumber\n";

Вывод:

Внутри функции: 10
Вне функции: 5

Как видно, значение переменной $originalNumber не изменилось после вызова функции, так как функция работала с её копией.

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

Однако PHP предоставляет возможность явно передавать аргументы по ссылке, используя оператор амперсанда (&). В этом случае параметр функции становится "псевдонимом" или ссылкой на оригинальную переменную.

<?php
function modifyValueByReference(&$number) {
    $number = $number * 2;
    echo "Внутри функции: $number\n";
}

$originalNumber = 5;
modifyValueByReference($originalNumber);
echo "Вне функции: $originalNumber\n";

Вывод:

Внутри функции: 10
Вне функции: 10

Теперь изменение параметра $number внутри функции напрямую влияет на оригинальную переменную $originalNumber.

3. Особенности с типами данных

Стандартные скалярные типы (int, float, string, bool) всегда передаются по значению.

<?php
function changeString($str) {
    $str = "Изменено";
}

$myString = "Оригинал";
changeString($myString);
echo $myString; // Выведет: "Оригинал"

Объекты и ресурсы в современных версиях PHP (с 5.x) передаются по значению, но с важной особенностью: копируется не сам объект, а ссылка на него. Это называется "передачей объекта по значению ссылки" (objects are passed by reference by value).

<?php
class MyClass {
    public $value = 10;
}

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

$myObject = new MyClass();
modifyObject($myObject);
echo $myObject->value; // Выведет: 20

Массивы также передаются по значению, что означает создание полной копии массива:

<?php
function modifyArray($arr) {
    $arr[] = "новый элемент";
}

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

4. Производительность и рекомендации

  • Преимущества передачи по значению: Безопасность данных, предсказуемость поведения функций, отсутствие побочных эффектов.
  • Недостатки: При работе с большими структурами данных (например, многомерными массивами) копирование может потребовать дополнительных ресурсов памяти и процессорного времени.
  • Рекомендация: Для оптимизации работы с большими массивами или когда необходимо модифицировать оригинальные переменные, используйте явную передачу по ссылке (&). Для объектов это обычно не требуется, так как они эффективно передаются по ссылке "под капотом".

Итог

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