17% скидка на размещение рекламы на площадках devby — до 20 ноября. Клац!
Support us

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

17 комментариев
Нашли баг в PHP: перезапись последнего значения массива предпоследним при использовании foreach со ссылкой на значения массива
Чтобы воспроизвести баг я написал вот такой небольшой пример:
" 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 стало известно, что проблема стара и даже описана в мануале.
Читайте также
Вакансии для Java/PHP Developer на jobs.dev.by
Вакансии для Java/PHP Developer на jobs.dev.by
Вакансии для Java/PHP Developer на jobs.dev.by
Вакансии для .NET/C# и PHP разработчиков на jobs.dev.by
Вакансии для .NET/C# и PHP разработчиков на jobs.dev.by
Вакансии для .NET/C# и PHP разработчиков на jobs.dev.by
TIOBE назвал «язык года»-2024
TIOBE назвал «язык года»-2024
TIOBE назвал «язык года»-2024
1 комментарий
Вакансии для PHP Developer на jobs.dev.by
Вакансии для PHP Developer на jobs.dev.by
Вакансии для PHP Developer на jobs.dev.by

Хотите сообщить важную новость? Пишите в Telegram-бот

Главные события и полезные ссылки в нашем Telegram-канале

Обсуждение
Комментируйте без ограничений

Релоцировались? Теперь вы можете комментировать без верификации аккаунта.

Комментариев пока нет.