Support us

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

Оставить комментарий
Нашли баг в 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 стало известно, что проблема стара и даже описана в мануале.
Читайте также
Вакансии для PHP-разработчиков на jobs.dev.by
Вакансии для PHP-разработчиков на jobs.dev.by
Вакансии для PHP-разработчиков на jobs.dev.by
TIOBE: Python снова на вершине, PHP на выходе из топ-10
TIOBE: Python снова на вершине, PHP на выходе из топ-10
TIOBE: Python снова на вершине, PHP на выходе из топ-10
Вакансии для PHP-разработчиков на jobs.dev.by
Вакансии для PHP-разработчиков на jobs.dev.by
Вакансии для PHP-разработчиков на jobs.dev.by
Топ языков программирования с самым большим сообществом разработчиков
Топ языков программирования с самым большим сообществом разработчиков
Топ языков программирования с самым большим сообществом разработчиков

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

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

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

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

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