Re: [VOTE] Generators

From: Date: Wed, 29 Aug 2012 21:50:12 +0000
Subject: Re: [VOTE] Generators
References: 1 2 3 4 5 6  Groups: php.internals 
Request: Send a blank email to internals+get-62588@lists.php.net to get a copy of this message
On Wed, Aug 29, 2012 at 10:19 PM, Derick Rethans <derick@php.net> wrote: > On Wed, 29 Aug 2012, Nikita Popov wrote: > >> On Wed, Aug 29, 2012 at 10:10 PM, Derick Rethans <derick@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

« previous php.internals (#62588) next »