On Sun, 2 Sep 2012, Gustavo Lopes wrote: > On Sun, 02 Sep 2012 02:27:02 +0200, Rasmus Lerdorf <ras...@lerdorf.com> wrote: > > > $things = getStuff(); > > foreach($things as $thing) { > > do_some($thing); > > } > > > > which is very normal PHP that you see in millions of lines of code, I > > would not expect to have to wrap my foreach in a try/catch here. > > [...] > > > > this is still going to fatal on me eventually with an uncaught exception > > on the foreach if, for example, I pass the generator a second time to > > something and it has run off the end. This is something you don't have > > to worry about currently and I think it will cause headaches for people > > when they start passing generators around. In theory I should be able to > > pass a generator to any existing code that takes an array without having > > to worry about modifying that code to catch foreach exceptions. And yes, > > I know it is actually a generator exception, but to the average user it > > will look like it is foreach throwing. > > I think the first thing anyone who uses generators must understand is that > they are iterators.
You forget that not even everybody that uses PHP knows what an iterator is. For all they care, they have an array they can run foreach() on. > They should be compared with iterators, not arrays. They shouldn't be compared with either. They are magical things that happen with a "yield" keyword. > With that in mind, the behavior is not surprising for anyone who knows > how iterators and foreach interact. > > More importantly, there is no other satisfactory solution (except a fatal > error). foreach has no return value, so it has no other way to signal a > failure. If we used a notice or a warning here what would happen is that code > that used generators with an invalid state would, except for the notice, work > as if it had been given an empty iterator. Put another way, it would fail with > only a notice, and continue. Continue doing what? cheers, Derick -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php