On Wed, Aug 29, 2012 at 10:19 PM, Derick Rethans <der...@php.net> wrote: > On Wed, 29 Aug 2012, Nikita Popov wrote: > >> On Wed, Aug 29, 2012 at 10:10 PM, Derick Rethans <der...@php.net> wrote: >> > On Wed, 29 Aug 2012, Nikita Popov wrote: >> > >> >> > function &bind(array $keys, array &$row) >> >> > { >> >> > foreach($keys as $key) >> >> > yield $key => $row[$key]; >> >> > } >> >> > >> >> > $row = []; >> >> > $it = bind(['a', 'b'], $row); >> >> > >> >> > foreach($it as $key => &$ref) >> >> > echo $key; >> >> > echo "\n"; >> >> > foreach($it as $key => &$ref) >> >> > echo $key; >> >> >> >> Thanks, this is now fixed. It'll throw an exception now, saying that >> >> you can't traverse an already closed generator. >> > >> > Nothing in the core throws an exception, why would this?! >> >> To my knowledge all iterator-related functionality is supposed to >> throw exceptions (as it is a feature related to the object oriented >> part of PHP). At leas this is what a quick search of the code base >> gave me. (See http://lxr.php.net/xref/PHP_TRUNK/ext/spl/spl_dllist.c#1248 >> for example). > > "ext/spl" - SPL is not *core* language. The generators are. Don't throw > exceptions from core features!
In general I agree with core language features shouldn't be throwing exceptions... But SPL definitely should never have been its own extension and most of it should have been core language features - and throwing exceptions in many of those cases makes perfect sense. We also have the case of IteratorAggregate throwing exception (which is a *core* language feature, not defined in ext/spl): $ ./sapi/cli/php -r 'class foo implements IteratorAggregate { function getIterator() { return new stdclass; } } foreach(new foo as $bar) {}' Fatal error: Uncaught exception 'Exception' with message 'Objects returned by foo::getIterator() must be traversable or implement interface Iterator' in Command line code:1 Stack trace: #0 Command line code(1): unknown() #1 {main} thrown in Command line code on line 1 -Hannes -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php