Нашли баг в PHP: перезапись последнего значения массива предпоследним при использовании foreach со ссылкой на значения массива

12 января 2011, 17:17
Чтобы воспроизвести баг я написал вот такой небольшой пример:
" microtime(1), $i); //fill array with some examples 
} 

foreach ($a as &$b) {
//do nothing, with link on value '&'
}

foreach ($a as $b) {
//do nothing, without '&'
}

print_r($a); //LOOK AT LAST 2
По умолчанию в переборе foreach для значения создается копия элемента из массива, но если нам надо внести правки в исходные значения - можно создать ссылку на элемент массива. Суть проблемы - переменная AS из форича доступна в глобальном скоупе после конца цикла и содержит последний элемент перебора, в нашем случае ссылку на последний элемент массива. Используя это же имя переменной в следующем переборе мы каждой итерацией перезаписываем последний элемент исходного массива по ссылке вплоть до предпоследнего. Все проблемы из-за отсутствия четкой типизации в языке. Для быстрого фикса подобной проблемы нужно между первым и вторым циклом выполнить unset($b);. UPD: Благодаря комментарию юзера xpurpur стало известно, что проблема стара и даже описана в мануале.
подписка на главные новости 
недели != спам
# ит-новости
# анонсы событий
# вакансии
Обсуждение