2014-05-20 33 views
6

me e un collega ha trovato un comportamento molto strano utilizzando la nuova parola chiave "resa" in versione di PHP: 5.5.11 e vogliamo sapere se ciò che segue è normale:PHP Yield, strano comportamento

data è il seguente codice:

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

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

var_dump(yieldTest()); 

la cosa curiosa è che se "resa" esiste nella funzione, sia: eco e dado è completamente saltata e non eseguita e soltanto la "resa" oggetto costruisce è var_dumped.

Quando si costruisce manualmente l'array/oggetto e si utilizza return, funziona come previsto.

Abbiamo scoperto che anche i salti totali generano eccezioni una volta che la resa esiste nella funzione.

Questo comportamento molto strano è realmente previsto o abbiamo trovato un bug?

Non possiamo davvero credere che questo sia voluto perché ridurrebbe drasticamente l'affidabilità delle funzioni.

Inoltre Google non ha cancellato alcuna informazione relativa a questo problema, quindi perché ho pensato di chiedere qui.

risposta

8

Il tuo var_dump emette solo un oggetto generatore. In questo momento di esecuzione la funzione non è stata inserita. Se si procede in realtà utilizzando il generatore, viene eseguito il codice della funzione:

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

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

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

output

wtf1string (3) stringa "pippo" (3) "bar" stringa (3) "baz"

o solleva l'eccezione se si commenta in.

+0

proprio a destra. Buona risposta. – lonesomeday

+0

Lol questo è difficile. Abbiamo testato tutto ma non quello, la funzione era in uso e questo perché è sembrato essere completamente non logico, tuttavia questo è ancora strano come un preprocessore e può rendere le funzioni abbastanza inaffidabili che qualche codice venga saltato o eseguito quando non lo si desidera realmente. Comunque grazie per il tuo feedback rapido e corretto. – Steini

+0

È documentato, a proposito: http://www.php.net/manual/en/language.generators.syntax.php#language.generators.object – lonesomeday