(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Обход областей видимости или неожиданное поведение функции EACH

Источник: habrahabr
Mendel

Никогда не понимал зачем в PHP функция each. Ведь есть foreach…
Но сегодня у меня "сломался" один участок кода, который жил шесть лет.
Там была конструкция с использованием each.
ошибка была исправлена секунд за 30 - давно думал исправить это все на foreach, но оставлял в качестве напоминания о том, какой индокод у меня был в свое время. Но просто исправить и пройти мимо я не мог.
Итак each против ООП:
1 - each игнорирует области видимости и спокойно выводит private свойства.
2 - each работает в обход стандартных интерфейсов вроде Iterator или ArrayAccess - классы реализующие эти интерфейсы всё равно обрабатываются данной функцией неправильно.
3 - Казенный класс ArrayObject воспринимается ею правильно.
4 - Классы наследующие от ArrayObject также работают верно.

5 - Формат возвращаемых данных тоже специфичен.
5.1 - имена свойств возвращаются в виде "имя_класса"."имя_свойства" (где точка это конкатенация)
5.2 - цикл while (list($key, $value) = each($data)) возвращает хоть сколько-то ожидаемый результат 
5.3 - Но реально она возвращает нам ЧЕТЫРЕ значения.

class my {
    private $love = 'girl';
}
$obj = new my;
while ($line = each($obj)) {
    var_dump($line);
}

Возвращает:
array(4) { [1]=> string(4) "girl" ["value"]=> string(4) "girl" [0]=> string(8) " 

Если у вас как и у меня появились вопросы почему при таком порядке записей в ответе LIST работает "правильно", то перечитайте внимательно описание к LIST. Как оказалось я неправильно понимал логику работы LIST, и она работает вовсе не по порядку, а по индексам. Об этом подробно уже было написано, не буду останавливаться.

Есть гипотеза, что такое поведение связано с тем, что функция получает на входе ССЫЛКУ на массив.
Возможно таким образом интерпретируется структура объекта как массива…
Стоит поэкспериментировать с наследованим и переопределением свойств, доступом к родительским и т.п., но пока не вижу во всем этом практического применения. Вернее интуитивно подозреваю что это может привести к более серьезной уязвимости чем доступ к приватным свойствам, но пока не знаю что с этим делать дальше…

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 05.10.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
SmartBear Collaborator - Concurrent User License (Includes 1 Year Maintenance)
IBM RATIONAL Clearcase Floating User From Rational Clearcase Lt Floating User Trade Up License + Sw Subscription & Support 12 Months
JIRA Software Commercial (Cloud) Standard 10 Users
Stimulsoft Reports Server Team 10 users
SAP CRYSTAL Reports 2013 WIN INTL NUL
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Компьютерный дизайн - Все графические редакторы
OS Linux для начинающих. Новости + статьи + обзоры + ссылки
Новые материалы
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100