Hi Jeremy, > On Jun 30, 2016, at 3:01 PM, Jeremy Mikola <jmik...@gmail.com> wrote: > > Was there any discussion about a special allowance being made for stdClass? > > I've noted the is_iterable(new stdClass) example and ensuing "Object > Iteration" section: > > PHP allows any object to be used with foreach. However, iterable does not > accept any object, only those implementing Traversable. Values accepted by > iterable should be designed for iteration, not any set of values (such as the > public properties of an object or a string). > > I'm on the fence if that second sentence applies to stdClass. Based on how > users typically end up with stdClass instances (e.g. casting arrays to an > object, json_decode()), I tend to think of them as logically equivalent to > associative arrays. To that end, I'd consider stdClass to be as "designed for > iteration" as any associative array -- if we can even say a stdClass was > designed at all :) > > As-is, the RFC requires users to either cast stdClass instances to an array > or decorate them with an Iterator (e.g. ArrayObject). I find this a bit > irksome, but it's certainly easy to work around. > > That said, I realize that voting is in progress and it's not my intention to > interrupt anything. I just wanted to relay a viewpoint that might not have > come up. >
Generally when I've seen an object that did not implement Traversable used with foreach it has been an error. The exception of course is stdClass, particularly because of json_decode(). There was no discussion on the list of allowing stdClass, but I did discuss it with some people in chat. Our consensus was that a casting to an array was a reasonable and simple requirement to allow an instance of stdClass to be iterable. I do not think stdClass was designed for iteration, but rather is just used this way because of the behavior of foreach. I'd prefer json_decode() to return an iterable object... maybe an RFC for another day. Aaron Piotrowski