예제는 답변 끝에 있습니다.
(a)에서 우리는 자체적으로 배열을 삽입하려고합니다. 그러나 copy on write라는 메커니즘이 $ a의 복사본에 $ a를 삽입하고 빈 배열을 포함하는 배열로 끝납니다. (b) 조금 까다 롭습니다. 먼저 자체에 대한 참조를 포함하는 배열을 만들지 만 $ b 자체가 참조가된다는 의미입니다. 그런 다음 serialize하려면 $ b를 전달하지만 serialize는 값만 허용하므로 $ b의 복사본을 만듭니다. 출력에는 자체에 대한 참조가 포함 된 배열이 포함 된 배열이 표시됩니다. R : 2; 출력에서 두 번째 배열에 대한 참조를 나타냅니다. 어떤 내부 이유 때문에 카운트는 1이 아니라 0으로 시작됩니다. (정말로 관심이 있다면 그 이유를 찾을 수 있지만이 질문에 대해서는 그냥 받아 들일 수 있습니다).
개체 행동 조금 다릅니다. 이는 PHP의 객체가 ID로 액세스되고 쓰기시 복사가 객체 자체가 아닌 ID 구조 만 복제하기 때문입니다. (c)의 결과에서 이것이 작은 r임을 알 수 있습니다. 번호는 위와 같습니다. 그러나 (d)에서 볼 수 있듯이 객체를 참조로 할당 할 수 있고 작은 r은 대문자 R이됩니다. 출력은 (b)와 다릅니다. 왜냐하면 $ d가 $ b처럼 복사되지만 ID 구조에만 영향을주기 때문입니다 우리는 자체에 대한 참조를 포함하는 객체를 보게됩니다. (e)는 복제본 키워드를 사용하여 실제 사본을 작성하고이를 직렬화합니다.
Further Reading PHP refereces.
<?php
$a = [];
$a[] = $a;
echo "\na: ".serialize($a);
$b = [];
$b[] =& $b;
echo "\nb: ".serialize($b);
$c = new stdClass();
$c->c = $c;
echo "\nc: ".serialize($c);
$d = new stdClass();
$d->d =& $d;
echo "\nd: ".serialize($d);
$e = new stdClass();
$e->e = clone $e;
echo "\ne: ".serialize($e);
출력 :
a: a:1:{i:0;a:0:{}}
b: a:1:{i:0;a:1:{i:0;R:2;}}
c: O:8:"stdClass":1:{s:1:"c";r:1;}
d: O:8:"stdClass":1:{s:1:"d";R:1;}
e: O:8:"stdClass":1:{s:1:"e";O:8:"stdClass":0:{}}
Link와 함께 놀러.
댓글에 명확한 설명을 물어 보는 것이 좋습니다. 질문은 상당히 광범위하며 간략하게 설명하려고합니다.
php 배열에서 매우 일반적인, 그래서 만약 당신이 요소 중 하나를 설정하고 recursivle 열거하려고하면 그냥 영원히 얻을 것이다 그래서 그것을 serialize 할 때 지능적으로 그것을 순환 참고를 위해 분석 할 필요가 만든 무한히 큰 배열 – noone392
좋은 설명이 있습니다 [여기] (https://derickrethans.nl/circular-references.html) – miknik
끝없는 계단의 그림을 알 수 있습니다. 그렇습니다. – ArtisticPhoenix