2010-01-14 12 views
7

Questo è il test e la risposta che ottengo. Penso che questo potrebbe essere problematico e dovrebbe generare un errore o un avviso, ma non riesco a capire perché sia ​​tollerato.la ricorsione dell'array PHP non dovrebbe generare un errore?

<?php 
    $test = array(0 => 'test', 1=> &$test); 
    var_dump($test); 

    // array(2) { [0]=> string(4) "test" [1]=> &array(2) { [0]=> string(4) "test" [1]=> &array(2) { [0]=> string(4) "test" [1]=> *RECURSION* } } } 
?> 
+0

Sono piuttosto sorpreso di poter fare riferimento a '$ test' nella stessa espressione che ha definito' $ test'. '$ test = array ('test'); $ test [] = &$test; 'è abbastanza chiaro. Ma il tuo ... – Gumbo

+0

Questo non è un problema reale e sono rimasto sorpreso anch'io. Stavo solo giocando con matrici e ho colpito un dilemma personale. –

+0

@Gumbo PHP è strano. È possibile assegnare riferimenti prima che il valore esista: '$ x = & $y; $ y = 5;' ad esempio è valido, con '$ y' non essendo mai stato definito in precedenza. – Paulpro

risposta

5

È una vera ricorsione e *RECURSION* non è un vero messaggio di errore. Non è un problema, perché $test non è ricorrente, e in questo caso var_dump è abbastanza intelligente da fermarsi prima di esaurire la memoria.

1

Suppongo che rilevare tale ciclo non è banale, e sarebbe immediatamente evidente durante l'esecuzione se il comportamento è stato corretto.

1

Perché è problematico? PHP è abbastanza intelligente da identificare che un array viene chiamato in modo ricorsivo.

Lo stesso accade se si print_r($GLOBALS), non vedo alcun danno in questo.

1

Si sta impostando un riferimento, ovvero un puntatore in modo che non vi sia una vera ricorsione, nessun ciclo. Quindi no, non dovrebbe generare un errore.

0

In realtà il messaggio *RECURSION* è un messaggio di errore che termina l'esecuzione dello script. Altrimenti lo eseguirà fino al raggiungimento del limite di memoria.

Problemi correlati