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

Reply via email to