변수처리 debug_zval_dump
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
debug_zval_dump — 출력할 내부 zval 구조의 문자열 표현을 덤프합니다.
설명
debug_zval_dump(mixed $value
, mixed ...$values
): void
출력할 내부 zval(Zend 값) 구조의 문자열 표현을 덤프합니다. 이것은 Zend Engine 또는 PHP 확장의 구현 세부 사항을 이해하거나 디버깅하는 데 주로 유용합니다.
매개변수
value
- 덤프할 변수 또는 값입니다.
values
- 덤프할 추가 변수 또는 값입니다.
반환 값
값이 반환되지 않습니다.
Examples
예제 #1 debug_zval_dump() 예제
<?php
$var1 = 'Hello';
$var1 .= ' World';
$var2 = $var1;
debug_zval_dump($var1);
?>
위의 예는 다음을 출력합니다.
string(11) "Hello World" refcount(3)
이 함수에 의해 표시되는 refcount
값은 엔진 구현에 대한 자세한 이해 없이는 놀랄 수 있습니다.
Zend Engine은 두 가지 다른 목적으로 참조 카운팅을 사용합니다.
- 동일한 값을 보유하는 여러 변수가 메모리의 동일한 사본을 가리키는 "기록 시 복사"라는 기술을 사용하여 메모리 사용을 최적화합니다. 변수 중 하나가 수정되면 메모리의 새 복사본을 가리키고 원본의 참조 횟수는 1만큼 감소합니다.
- 참조에 의해 할당되거나 전달된 추적 변수(참조 설명 참조). 이 refcount는 현재 값의 zval을 가리키는 별도의 참조 zval에 저장됩니다. 이 추가 zval은 현재 debug_zval_dump()에 의해 표시되지 않습니다.
debug_zval_dump()는 값으로 전달되는 일반 매개변수로 입력을 받기 때문에 copy on write 기술을 사용하여 전달합니다. 데이터를 복사하는 대신 함수 호출의 수명 동안 refcount가 하나씩 증가합니다. 함수가 매개변수를 받은 후 수정한 경우 복사본이 만들어집니다. 그렇지 않기 때문에 호출 범위보다 하나 더 높은 refcount를 표시합니다.
매개변수 전달은 참조에 의해 할당된 변수를 표시하는 debug_zval_dump()도 방지합니다. 설명을 위해 위의 예를 약간 수정한 버전을 고려하십시오.
<?php
$var1 = 'Hello';
$var1 .= ' World';
// Point three variables as references to the same value
$var2 =& $var1;
$var3 =& $var1;
debug_zval_dump($var1);
?>
위의 예는 다음을 출력합니다.
string(11) "Hello World" refcount(2)
$var1, $var2, $var3은 참조로 연결되어 있지만 debug_zval_dump()에는 값만 전달됩니다. 이 값은 참조 세트에 의해 한 번 사용되고 debug_zval_dump() 내부에서 한 번 사용되므로 refcount 2를 표시합니다.
다른 데이터 유형에 대한 엔진 최적화로 인해 더 복잡한 문제가 발생합니다. 정수와 같은 일부 유형은 "기록 시 복사"를 사용하지 않으므로 참조 수를 전혀 표시하지 마십시오. 다른 경우에 refcount는 리터럴 문자열이나 배열이 코드 명령어의 일부로 저장되는 경우와 같이 내부적으로 사용된 추가 복사본을 보여줍니다.
기타
- var_dump() - 변수에 대한 정보를 덤프합니다.
- debug_backtrace() - 역추적 생성
- References Explained
- » References Explained (by Derick Rethans)