не должна ли рекурсия массива PHP выдавать ошибку? - PullRequest
7 голосов
/ 14 января 2010

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

<?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* } } }
?>

Ответы [ 5 ]

5 голосов
/ 14 января 2010

Это рекурсия, а *RECURSION* не является реальным сообщением об ошибке. Это не проблематично, поскольку $test активно не повторяется, и в этом случае var_dump достаточно умен, чтобы остановиться перед исчерпанием памяти.

1 голос
/ 14 января 2010

Почему это проблематично? PHP достаточно умен, чтобы определить, что массив вызывается рекурсивно.

То же самое происходит, если вы print_r($GLOBALS), я не вижу в этом никакого вреда.

1 голос
/ 14 января 2010

Вы устанавливаете ссылку, то есть указатель, чтобы не было истинной рекурсии или цикла. Так что нет, это не должно выдавать ошибку.

1 голос
/ 14 января 2010

Я бы предположил, что обнаружение такого цикла нетривиально, и было бы сразу видно во время выполнения, если поведение было неправильным.

0 голосов
/ 14 января 2010

На самом деле сообщение *RECURSION* является сообщением об ошибке, которое завершает выполнение скрипта. В противном случае он будет выполняться до тех пор, пока не будет увеличен предел памяти.

...