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

Что происходит когда переменная передается по значению?

2.0 Middle🔥 192 комментариев
#PHP Core#ООП

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

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

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

Передача переменной по значению в PHP

Что такое передача по значению?

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

Как работает механизм в PHP

В PHP при передаче аргументов в функцию по умолчанию используется передача по значению. Рассмотрим пример:

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

$number = 5;
echo "До вызова функции: $number\n";

modifyValue($number); // Передача по значению

echo "После вызова функции: $number\n";

// Результат:
// До вызова функции: 5
// Внутри функции: 10
// После вызова функции: 5
?>

Что происходит в памяти?

  1. Создание копии: PHP создаёт копию значения переменной в памяти
  2. Отдельное хранение: Копия существует в отдельной области памяти
  3. Изоляция изменений: Любые модификации происходят только с копией

Особенности для разных типов данных

Скалярные типы

<?php
function modifyScalar($x) {
    $x = 'изменено';
    return $x;
}

$original = 'оригинал';
$modified = modifyScalar($original);

echo $original; // выводит 'оригинал'
echo $modified; // выводит 'изменено'
?>

Массивы

С массивами копирование происходит при записи (copy-on-write):

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

$originalArray = ['a', 'b', 'c'];
$newArray = modifyArray($originalArray);

print_r($originalArray); // остался без изменений
print_r($newArray);      // содержит новый элемент
?>

Объекты

С PHP 5+ объекты передаются по ссылке, но сама ссылка передаётся по значению:

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

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

$example = new Example();
echo $example->value; // 10

modifyObject($example);
echo $example->value; // 20 (объект изменился!)
?>

Копирование при записи (Copy-on-Write)

PHP использует оптимизацию копирования при записи для экономии памяти:

<?php
$array1 = range(1, 1000000); // Большой массив
$array2 = $array1;           // Пока копия не создаётся

$array2[0] = 999;            // Только теперь создаётся копия
?>

Сравнение с передачей по ссылке

<?php
// По значению (по умолчанию)
function byValue($param) {
    $param = 'изменено';
}

// По ссылке
function byReference(&$param) {
    $param = 'изменено';
}

$variable = 'оригинал';

byValue($variable);
echo $variable;      // 'оригинал'

byReference($variable);
echo $variable;      // 'изменено'
?>

Практические последствия

  1. Безопасность: Изменения внутри функции не затрагивают внешний код
  2. Потребление памяти: Для больших структур данных может создавать избыточные копии
  3. Производительность: Передача по значению может быть менее эффективной для больших данных
  4. Предсказуемость: Поведение кода более предсказуемо и менее подвержено побочным эффектам

Когда использовать передачу по значению?

  • По умолчанию всегда: Это делает код более предсказуемым
  • Небольшие данные: Для скалярных значений это оптимально
  • Когда изменения должны быть локальными: Если функция не должна менять внешние переменные
  • Функциональное программирование: Для создания чистых функций без побочных эффектов

Оптимизации в современных версиях PHP

Начиная с PHP 7, оптимизации стали ещё более эффективными:

  • Улучшенное копирование при записи
  • Более эффективное управление памятью для массивов
  • Интернирование строк для экономии памяти

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

Что происходит когда переменная передается по значению? | PrepBro