2017-12-06 20 views
2

나는 다음과 같은 인용 텍스트 건너 온 :자체에 대한 참조를 포함하는 배열은 무엇입니까? 배열/객체 내부의 순환 참조 란 무엇입니까? PHP에서 이러한 엔티티를 직렬화하는 방법은 무엇입니까? 내장 함수 <code>serialize()</code>에 대한 매뉴얼 페이지를 읽는 동안

할 수 있습니다 심지어 직렬화() 자체에 대한 참조를 포함 배열. 직렬화중인 배열/객체 내의 순환 참조는 으로 저장됩니다. 다른 참조는 없어집니다.

자체에 대한 참조가 포함 된 배열의 의미는 무엇입니까?

또한 배열/개체 내부의 순환 참조는 무엇입니까?

I는 상기 텍스트에서 알 유일 I가 더 코드로서는 없거나 설명이 주어졌다, serialize()

또한 내장 함수를 이용하여 값의 이러한 종류의 저장 표현을 생성 할 수있다 이 점에 대해서.

특히 PHP에서 이러한 유형의 엔티티의 의미를 이해하기 위해 인터넷 검색을 시도했지만 Google은 아무 것도 얻지 못했습니다.

누군가 적절한 코드 예제와 함께 이해하기 쉬운 설명을 통해 이러한 개념을 설명해 주실 수 있습니까? 예를 통해 상황을 더 잘 이해할 수 있습니다.

+0

php 배열에서 매우 일반적인, 그래서 만약 당신이 요소 중 하나를 설정하고 recursivle 열거하려고하면 그냥 영원히 얻을 것이다 그래서 그것을 serialize 할 때 지능적으로 그것을 순환 참고를 위해 분석 할 필요가 만든 무한히 큰 배열 – noone392

+0

좋은 설명이 있습니다 [여기] (https://derickrethans.nl/circular-references.html) – miknik

+0

끝없는 계단의 그림을 알 수 있습니다. 그렇습니다. – ArtisticPhoenix

답변

1

예제는 답변 끝에 있습니다.

(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와 함께 놀러.

댓글에 명확한 설명을 물어 보는 것이 좋습니다. 질문은 상당히 광범위하며 간략하게 설명하려고합니다.