Ответ
По умолчанию аргументы передаются по значению. Это означает, что функция работает с копией переданного значения. Изменения этой копии внутри функции не затрагивают оригинальную переменную.
Пример передачи по значению:
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 Ответ 18+ 🔞
Ну вот, сидишь ты такой, пишешь код, и тут — бац! — понимаешь, что твоя функция нихуя не меняет переменную снаружи. А всё почему? Да потому что в PHP, ёпта, по умолчанию всё передаётся по значению, то есть по копии. Представь: ты даёшь другу ксерокс своей фотографии, он на ней усы рисует, а твоё оригинальное лицо остаётся чистым. Вот и тут так же.
Смотри, вот тебе классический пример, от которого волнение ебать:
function increment($number) {
$number++;
echo "Внутри функции: $numbern"; // Выведет 6
}
$originalValue = 5;
increment($originalValue);
echo "Снаружи: $originalValuen"; // Выведет 5 (оригинал не изменился)
Видишь? Внутри функции $number стал шестёркой, а снаружи наша $originalValue так и осталась пятёркой, ни о чём не подозревает. Чистая магия, только вот доверия ебать ноль — всё из-за этой копии.
А если надо по-настоящему, чтобы менялось?
Тогда надо передавать по ссылке, явно указав амперсанд (&) в объявлении функции. Это как дать другу не копию фотки, а доступ к твоему инстаграму, чтобы он мог там что угодно нарисовать.
function incrementByReference(&$number) {
$number++;
}
$value = 5;
incrementByReference($value);
echo $value; // Выведет 6
Вот теперь работает! Переменная $value стала шестёркой, потому что мы работали не с её клоном, а с самой оригинальной сущностью. Удивление пиздец, да?
Но есть один особый случай, где всё с ног на голову. Это объекты. Начиная с PHP 5, объекты передаются по так называемой "ссылке по значению". Звучит как "полупидор", но суть в том, что ты передаёшь не весь объект, а лишь ссылку на него. И получается, что изменения свойств этого объекта внутри функции — они видны везде. Это как если бы ты дал другу не фотку, а адрес своей квартиры и сказал: "Иди, покрась там стену". Стена-то будет покрашена для всех.
class MyClass {
public $property = 1;
}
function modifyObject($obj) {
$obj->property = 2; // Меняем свойство того самого объекта
}
$instance = new MyClass();
modifyObject($instance);
echo $instance->property; // Выведет 2
Видишь? Мы не использовали &, но свойство property изменилось на 2. Потому что $obj внутри функции — это ссылка на тот же самый объект $instance. Вот такая хитрая жопа с этими объектами.
Так что запомни: примитивы (числа, строки) копируются, а объекты — нет. И если тебе нужно менять примитивы на месте — ставь амперсанд и не парься. А то будешь потом сидеть и думать: "Какого хуя у меня ничего не меняется?". Всё просто, как три копейки.