Есть 2 программы. Чисто для теста, бессмысленные.
$a = array(1, 2, 3);
foreach ($a as &$row) {
$row = 2;
}
echo $a[1];
Здесь программа выведет 2, что и подразумевалось.
Теперь следующий код:
$a = array(1, 2, 3);
foreach ($a as $key => $row) {
$row = &$a[$key];
$row = 2;
}
echo $a[1];
Но он выведет 3. (но если заменить $row в теле цикла на другую переменную, то все будет ок).
Почему второй способ выводит 3 вместо 2?
И второй вопрос: как правильно понимать жесткие ссылки в PHP? Например, если записать $a = &$b, то это значит (как я понимаю), что переменная $a ссылается на значение, взятое из адреса $b (хотя тут про адреса не стоит наверное упоминать, ну да ладно). И при изменении любой из переменных, изменится значение адреса, поэтому и в $a, и в $b значения поменяются (типо синонимы). Но почему тогда при передаче в функцию по ссылке мы ставим перед параметром знак &? Пример: function check(&b) { //что-то делаем с переменной извне }; $a = 3; check($a);
Если расшифровать передачу аргумента, то получается, что мы передаем по ссылке вот что: &b = $a, но это, по идее, неправильно (синтаксис), однако работает. Если записать &b = $a в реальности, то интерпретатор выдаст ошибку, так как надо b = &$a. В том же С++ записывается именно первым способом (кроме записи указателей *), и поэтому там никаких вопросов передачи в функцию объектов нет. Или же запись &b в параметрах функции - это как исключение и нужно запомнить, что при этом b будет являться ссылкой на переданный параметр? В общем, просветите.
$a = array(1, 2, 3);
foreach ($a as &$row) {
$row = 2;
}
echo $a[1];
Здесь программа выведет 2, что и подразумевалось.
Теперь следующий код:
$a = array(1, 2, 3);
foreach ($a as $key => $row) {
$row = &$a[$key];
$row = 2;
}
echo $a[1];
Но он выведет 3. (но если заменить $row в теле цикла на другую переменную, то все будет ок).
Почему второй способ выводит 3 вместо 2?
И второй вопрос: как правильно понимать жесткие ссылки в PHP? Например, если записать $a = &$b, то это значит (как я понимаю), что переменная $a ссылается на значение, взятое из адреса $b (хотя тут про адреса не стоит наверное упоминать, ну да ладно). И при изменении любой из переменных, изменится значение адреса, поэтому и в $a, и в $b значения поменяются (типо синонимы). Но почему тогда при передаче в функцию по ссылке мы ставим перед параметром знак &? Пример: function check(&b) { //что-то делаем с переменной извне }; $a = 3; check($a);
Если расшифровать передачу аргумента, то получается, что мы передаем по ссылке вот что: &b = $a, но это, по идее, неправильно (синтаксис), однако работает. Если записать &b = $a в реальности, то интерпретатор выдаст ошибку, так как надо b = &$a. В том же С++ записывается именно первым способом (кроме записи указателей *), и поэтому там никаких вопросов передачи в функцию объектов нет. Или же запись &b в параметрах функции - это как исключение и нужно запомнить, что при этом b будет являться ссылкой на переданный параметр? В общем, просветите.