Что будет выведено, если мы применим функции для работы с массивами к объекту?

Фанат

oncle terrible
Команда форума
Многие уже видели, но всё равно.

Что будет выведено, если мы применим функции для работы с массивами к объекту?
Ни за что не догадаетесь!
PHP:
class Foo
{
    private $bar = 'baz';
    private $xyz = 'www';
}
$f = new Foo();
var_dump(key($f));
var_dump(current($f));
var_dump(next($f));
var_dump(key($f));
var_dump(current($f));
При изменении области видимости вывод так же меняется.
 

ksnk

прохожий
Получается - еще один способ добраться до приватных-защищенных методов ?
 

fixxxer

К.О.
Партнер клуба
Это из той же серии что и древний трюк:
$f = new Foo();
settype($f, 'array');
var_dump($f);
 

Yoskaldyr

"Спамер"
Партнер клуба
так это очень старая фича и фиксить врядли будут, т.к. by design, до рефлексии и до кложур это использовали для доступа к защищенным свойствам
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Получается - еще один способ добраться до приватных-защищенных методов ?
Единиственный предсказуемый, не триггерящий магию.

Ага. Пока не пофиксят :)
@Фанат
Это считается большинством фичей, и докуменрованным поведением. Можно вот тут обсуждение почитать, довольно интересное: https://externals.io/message/105589
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
обсуждение почитать, довольно интересное: https://externals.io/message/105589
пока читал, повторял про себя "они это не приняли, не надо расстраиваться",
дебажить рекурсивные вызовы __toArray() в ORM-объектах, которые строятся по связям таблиц - это ж застрелиться!
функции для работы с массивами не принимают ArrayAccess, а они еще магии хотят
 
Сверху