2013-10-04 5 views
2

참조 개체를 사용하여 다음과 같은 stdClass 개체와 할당이 있습니다. 그러나 unset 후에여전히 $B의 이전 값을 출력하면 새 값이 $A->foo 속성에 할당 된 경우에도 $A의 이전 값이 출력됩니다. 아래의 추적을 참조하십시오.stdClass 개체 및 섀도 복사본 이상한 출력

<?php 
$A = new stdclass; 
$A->foo = 'AAA'; 
echo "Ouput $ A:"; 
echo "<pre>"; 
print_r($A); 

/* 
stdClass Object 
(
    [foo] => AAA 
) 
*/ 

$B = &$A; 
unset($A); 

$A = new stdclass; 
$A->foo = 'aaa'; 
echo "after unset $ A and again assigning new value. Ouput $ A:"; 
echo "<pre>"; 
print_r($A); 
/* prints like 
stdClass Object 
(
    [foo] => aaa 
) 
*/ 

echo "Ouput $ B:"; 
echo "<pre>"; 
print_r($B); 
/* prints like 
stdClass Object 
(
    [foo] => AAA 
) 
*/ 

편집 :

질문 $B$A의 참조를 할당되었다고하지만 $A

  1. 의 해제 후에는 $A의 이전에 할당 된 값의 값을 인쇄 할 수 있습니다 어떻게?
  2. $A이 설정되어 있지 않고 $B$A의 값을 인쇄하려고하면 $A의 새 값을 인쇄해야합니까? source 객체 인 경우 우리가 Shadow Copy의 경우 아시다시피

vanished/destroyed 다음 reference 객체는 source 객체가 가리키는 된 위치를 가리 수 없습니다.

+0

무엇이 질문입니까? – Oswald

+0

@Oswald, 아래의 업데이트 된 질문을 참조하십시오. – NullPointer

답변

2

unset($A)이 아니라 NULL으로 설정하십시오. Unset은 다른 경우에 매우 다른 행동을하며, manual을 살펴볼 가치가 있습니다.

는 $ A의 이전에 할당 된 값의 값을 인쇄 할 수있는 방법
$A=NULL; 
//unset($A); 

Fiddle

+0

그래서, 어떻게'$ A = NULL;과'unset ($ A);를 구별 할 수 있습니까? – NullPointer

+0

NULL은 작업이 즉시 완료되도록하는 반면 unset은 다양한 상황과 다른 상황에 따라 다르게 다른 조건과 설정을 확인합니다. 참조 된 매뉴얼을 보시오. –

+0

@NullVoid'$ A = null'은'$ A'에'null '을 할당 할것이다. (즉시 값을 제거하면 참조에도 영향을 미친다.) 'unset ($ A)'는 변수를'deleted'로 표시하지만 값을 제거하지는 않습니다 (접근 할 수 없지만 GC가 삭제할 때까지 메모리에 남아 있습니다). –

1

?

$A으로 식별되는 개체는 $B으로 참조됩니다. 그렇기 때문에 unset($A)은 개체를 가비지 수집 할 수 없습니다.

$ A가 설정되어 있지 않고 $ B가 $ A의 값을 인쇄하려고한다면 $ A의 새로운 값을 인쇄해야합니까?

아니, unset 휴식 $A$B 사이의 연결. 그런 다음 $A = new stdclass은 새 변수 (동일한 이름을 가진 경우)를 만듭니다.

+0

그래서 'Memory'가 두 객체 '$ A'와 '$ B'에서 다르게 점유되었다고 말할 수 있습니까? 이것은 '섀도 복사본'의 경우가 아니기 때문입니다. – NullPointer

+0

'unset'은 변수들 사이의 연결을 끊지 않습니다. 그러나 두 변수가 가리키는 메모리에 연결이 끊어 졌다고 말할 수 있습니다. –

+0

@ElonThan Ok. 그래서 두 개체가 같은 위치를 가리키고 있다고 결론 내릴 수 있습니까? 그러나'unset ($ A);에 의해서'$ A'만이 이전에 가리키고 있던 위치에 대한 연결을 끊었으며'$ B'는 여전히'$ A '에 의해 참조 된 같은 위치를 가리키고 있습니다, 맞습니까? – NullPointer

관련 문제