Доходность PHP, странное поведение


Мы с коллегой обнаружили очень странное поведение, используя новое ключевое слово "yield" в версии PHP: 5.5.11, и мы хотим знать, нормально ли следующее:

Приведен следующий код:

function yieldTest()
{
    echo 'wtf1';
    die('wtf2');

    foreach (['foo', 'bar', 'baz'] as $each) {
        yield $each;
    }
}

var_dump(yieldTest()); 

Любопытная вещь в этом заключается в том, что если "yield" существует в функции, оба: echo и die полностью пропускаются и не выполняются, и просто сборки объекта "yield" являются var_dumped.

Когда мы создаем массив/объект вручную и используем return, он работает так, как есть предназначенный.

Мы обнаружили, что он даже полностью пропускает исключения, когда в функции существует выход.

Действительно ли это очень странное поведение задумано или мы нашли ошибку?

Мы не можем действительно поверить, что это необходимо, потому что это резко снизило бы надежность функций.

Также Google не выдал никакой информации, связанной с этой проблемой, поэтому я подумал, что спрашиваю здесь.

Author: Steini, 2014-05-20

1 answers

Ваш var_dump просто выводит объект генератора. На данный момент выполнения функция не была введена. Если вы действуете на самом деле , используя генератор, выполняется код функции:

function yieldTest() {
    echo 'wtf1';
    //throw Exception('test');

    foreach (['foo', 'bar', 'baz'] as $each) {
        yield $each;
    }
}

$test = yieldTest();
foreach ($test as $k) {
  var_dump($k);
}

Вывод

Строка Wtf1(3) строка "foo" (3) строка "bar"(3) "baz"

Или вызывает исключение, если его прокомментировать.

 9
Author: GhostGambler, 2014-05-20 12:49:55