Передача по ссылке или передача по значению

<?php function sum($y) { $y = $y + 5; } $x = 5; sum($x); echo $x; ?> 

Поэтому у меня есть этот код. Вопросы: что он выводит? Ответ: 5. Как сделать вывод 10? Ответ: sum (& $ x).

Проблема в том, что я не понимаю, почему ответ на первый вопрос равен 5. Когда вы делаете сумму ($ x), не следует ли ее заменять на $ x, поэтому $ x = 5 + 5 = 10? Почему ответ 5? Я действительно не понимаю. Кто-то объяснил мне что-то, связанное с указателями и адресом, но я не понял. Я никогда не понимал концепцию указателей, и я искал ее, и, по-видимому, в php нет указателей, поэтому я смущен. Мой друг сказал, что переменная формируется из значения и адрес памяти этого значения. Может кто-нибудь объяснить мне, как мне 5 лет, почему ответ 5, а не 10? пожалуйста

Притворимся, что $x – это лист бумаги с 5 написанными на нем.

 function sum($y) { $y = $y + 5; } 

Здесь $yзначение того, что вы написали. Вы добавляете 5 к такому значению в своем уме, но примечание остается нетронутым.

 function sum(&$y) { $y = $y + 5; } 

С помощью ссылочного оператора ( &$y ) вы передаете самую бумагу функции, и она перезаписывает написанное на ней.


Для примитивных значений, таких как числа, я бы не стал беспокоиться и всегда return требуемое значение:

 function valuePlusFive($x) { return $x + 5; } $x = 5; $x = valuePlusFive($x); 

Это не очень хорошее объяснение с точки зрения теории, но это должно помочь вам понять концепцию:

когда вы объявляете такую ​​функцию, а затем вызываете ее:

 function ($argument) {...} 

Аргумент, который вы передаете, передается по значению. Это означает, что внутри области действия вы будете работать с копией аргумента, который вы передали. Вы можете себе представить, что до того, как функция называется копией аргумента, и внутри функции, которую вы работаете с копией, в то время как оригинал остается нетронутым. Как только функция будет закончена, копия больше не будет

Однако, когда вы заявляете это следующим образом:

 function (&$argument) {...} 

Вы передаете аргумент по ссылке, что означает, что вы работаете напрямую с переменной, которую вы передали. Итак, в этом случае копии не сделаны, вы взяли аргумент из одного места, поместили его внутри функции и поменяли.

В PHP «Объем переменной – это контекст, в котором он определен». ( согласно документам ). Таким образом, внутри вашей функции работает $y (копия значения, в котором вы проходили), но функция не возвращается функцией. Поэтому, когда функция заканчивается, значение больше не доступно вне функции.

Если вы хотите передать переменную in по ссылке (аналогично указателю на C), вы можете добавить a & like так:

 function sum(&$y) { $y = $y + 5; } 

Теперь, когда вы вызываете этот код:

 $x = 5; sum($x); echo $x; 

он будет выводить 10. Может быть, лучший способ сделать это – вернуть значение из вашей функции и вывести это значение:

 function sum($y) { return $y + 5; } $x = 5; echo sum($x);