> 백엔드 개발 > PHP 튜토리얼 > PHP_php 기술의 변수 참조 및 변수 파괴 메커니즘 분석

PHP_php 기술의 변수 참조 및 변수 파괴 메커니즘 분석

WBOY
풀어 주다: 2016-05-16 20:31:47
원래의
882명이 탐색했습니다.

이 글에서는 PHP의 변수 참조 및 변수 소멸 메커니즘을 예제를 통해 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.

변수는 PHP에서 매우 중요한 유형입니다. 우리의 모든 데이터는 변수 또는 상수를 통해 작동됩니다. 아래에서 변수 참조 및 변수 소멸을 살펴보겠습니다.

PHP에서 "&" 기호는 참조를 나타냅니다.

1. 인용 없이 상황 보기:

코드 복사 코드는 다음과 같습니다.
$a = "hello world";//변수를 정의하고 할당 $b 이하로
$b = $a;//이 단계에서는 "$b= & $a"처럼 $a 앞에 & 기호를 추가하지 않습니다. &를 추가하지 않고 실제 원리는 $a 변수의 복사본을 만드는 것, 즉 새로운 주소를 적용하여 $b 변수를 메모리에 저장하는 것입니다

추신: PHP에서 "="를 사용하여 값을 직접 할당하는 것은 실제로 오른쪽에 있는 변수의 복사본을 b에 복사하는 것이며, 이로 인해 메모리 공간이 생성됩니다. 결과적으로 동일한 내용이 두 개의 복사본에 저장될 수 있습니다. 메모리. PHP 성능의 일부 측면에서 언급했듯이 이는 더 많은 메모리 공간을 차지합니다. 그러나 내 연락처에서는 대부분의 사람들이 이에 대해 큰 관심을 기울이지 않았습니다. 실제로 이러한 방식으로 일반적인 적용으로 인해 발생하는 중요한 차이는 분명하지 않습니다. 사실 저는 인용할 때 &를 자주 사용하지 않습니다. 하하. 단지 구현 원리에 대한 깊은 이해가 매우 필요하다고 생각합니다. 나는 근본적인 것에 집중하는 것을 좋아합니다.

2. 기호 및 인용을 사용하세요

코드 복사 코드는 다음과 같습니다.
$a = "hello world";
$b = &$a;

참조를 사용하면 PHP 엔진은 변수를 복사하지 않고 실제로 메모리의 $a 주소를 가리키며 $b는 이 포인터를 저장합니다.
따라서 참조를 사용할 때 $b의 값을 변경하면 $a도 그에 따라 변경됩니다
예:
코드 복사 코드는 다음과 같습니다.
$a = "hello world";
$b = &$a;
$b = "새 값 테스트";//b 값을 변경하면 a 값도 그에 따라 변경됩니다
echo $a;//b 값을 변경하면 a 값도 변경되므로 새 값 테스트를 출력합니다.

함수를 정의할 때 이런 상황을 자주 봅니다.

코드 복사 코드는 다음과 같습니다.
함수 테스트(& $param)
{
//함수 정의 내용
$param ;
}

설명: $param 앞에 참조가 있으므로 전달된 매개변수는 메모리에 복사되지 않고 원래 메모리 공간을 직접 참조합니다. 따라서 & 기호를 사용하여 전달된 변수 값이 수정되면 원래 메모리 공간의 값도 변경됩니다.
아래에서 퀴즈를 풀어보세요.
코드 복사 코드는 다음과 같습니다.
$k = 8;
테스트($k);
echo $k;//결과적으로 함수 내에서 $k 값이 변경되어 9가 출력됩니다.

다음과 같은 함수를 자주 볼 수 있습니다.
코드 복사 코드는 다음과 같습니다.
$return = & test_func();

나는 이전에 PHP 엔진의 메커니즘이 다음과 같다는 것을 배웠습니다. =는 오른쪽의 내용을 왼쪽의 변수에 복사합니다. 따라서 &를 사용한다는 것은 함수의 결과를 복사하는 것을 의미합니다. 실제로 포인터가 왼쪽의 변수에 제공된다는 것입니다.
포인터란 무엇인가? C 언어로 개념을 배웠습니다. 내 이해는 포인터, 포인터, 가리키는 바늘 (나침반, 하하)입니다. 포인터를 메모리 주소로 생각하면 컴퓨터는 메모리에서 데이터를 찾을 위치를 알 수 있습니다. 이건 피상적인 이해인데 ​​어떻게 깊이 이해해야 할지 모르겠어요, 하하.

요약: 참조를 사용하는 것은 메모리 리소스 사용량을 줄이는 것입니다.

PHP 매뉴얼에는 다음과 같이 참조 설명이 나와 있습니다.

PHP에서 인용한다는 것은 동일한 변수 내용에 다른 이름으로 액세스하는 것을 의미합니다. 이는 C 포인터와는 다릅니다. 대신 참조는 기호 테이블 별칭입니다. PHP에서는 변수 이름과 변수 내용이 다르기 때문에 동일한 내용이라도 다른 이름을 가질 수 있습니다. 가장 가까운 비유는 Unix의 파일 이름과 파일 자체입니다. 변수 이름은 디렉토리 항목이고 변수 내용은 파일 자체입니다. 참조는 Unix 파일 시스템의 하드링크로 간주될 수 있습니다.

3.변수를 파기할 때. 원래 값은 변경되지 않습니다.

테스트: $b = & $a;
$b의 값이 변경되었으므로 $a의 값도 변경됩니다. $b가 소멸되면(메모리에 공간을 차지하지 않고 null이 아니며 값이 ""임) $a의 값이 변경됩니다. 삭제하시겠습니까?

실제로 이 메커니즘을 구체적으로 언급한 PHP 관련 외국 서적이 있습니다. 2년 전에 봤어요. 잘 기억이 나지 않습니다. 변수가 삭제되면 자동으로 복사되는 것이 원칙입니다.

사실 이는 $b를 삭제하여 $a를 삭제하는 문제가 발생하는 것을 방지하기 위한 것입니다.

코드 복사 코드는 다음과 같습니다.
$a = 'd';
$b = & $a;
$b = 8;//인용되기 때문에 b의 값이 변경되고, a의 값도 8로 변경됩니다.
var_dump($b,$a);
unset($b);//변수 b를 삭제하려면 unset을 호출하세요. 변수 a는 삭제되지 않습니다
var_dump($b,$a);//null 및 8 출력

$b 변수를 삭제하기 위해 unset을 호출하면 PHP 엔진이 변수 기호 테이블에서 알아냈습니다. 삭제하려는 변수 $b는 원래 $a 변수를 참조하고 있는데, 한 번 삭제하면 $a 변수가 삭제되기 때문에 삭제하기 어렵습니다. 따라서 먼저 $a 변수의 복사본을 만든 다음 $b 변수를 삭제하세요.
PHP 기호 테이블에 관하여: 사실, 작업 중 모든 변수 이름이 여기에 기록되고 PHP가 이를 유지 관리한다는 것입니다. 물론 특정 데이터는 메모리에 저장됩니다. PHP는 이 기호 테이블을 사용하여 사용되지 않는 변수 공간을 재활용합니다. 메모리 공간을 확보하세요). 심볼 테이블을 기반으로 하는 PHP의 가비지 수집 메커니즘(더 이상 사용되지 않는 메모리 공간 해제)을 살펴보세요.
예시
코드 복사 코드는 다음과 같습니다.
$long="big_long_variable_name";
$$long="PHP"; /* $long 변수에 저장된 문자열을 새 변수의 변수 이름으로 사용합니다. 이는 $big_long_variable_name="PHP"와 동일합니다. $short=& $big_long_variable_name; /* $big_long_variable_name 변수의 값을 $short 변수에 할당합니다. 이때 $short의 값은 $short=& $$long; */
print "01 /$short is $short."; /* "/$"는 달러 기호 $가 출력됨을 나타내는 이스케이프 시퀀스입니다. 아래와 같습니다. 이 문의 기능은 다음을 출력하는 것입니다: 01 $short는 PHP입니다. print "02 Long은 $big_long_variable_name입니다." /* 출력: 02 Long은 PHP입니다. */
?>




$big_long_variable_name.=" 흔들림!" /* $big_long_variable_name 재할당. 재할당 과정에서 $big_long_variable_name 뒤에 . $big_long_variable_name 변수의 현재 값 전체 값은 "PHP Rocks!"입니다. 아래도 마찬가지입니다. */
print "03 /$short는 $short입니다"; /* 출력: 03 $short는 PHP입니다! print "04 Long은 $big_long_variable_name입니다"; /* 출력: 04 Long은 PHP입니다. */
?>




05 $short는 PHP가 최고입니다!
06 Long은 PHP입니다!




$short.="$short 프로그래밍"; /* $short 변수를 다시 할당합니다. $short 뒤에 .(점)이 추가되어 있으므로, $short의 값을 분석하려면 위의 예를 참고하시기 바랍니다. */
print "07 /$short는 $short입니다"; /* 출력:07 $short는 PHP입니다! PHP 프로그래밍은 훌륭합니다! print "08 Long is $big_long_variable_name"; /* $short 변수가 프로그래밍 PHP 바위!로 재할당되었으므로 $big_long_variable_name 변수의 값도 "PHP 바위! 프로그래밍 PHP 바위!"로 변경됩니다. 이 명령문 출력은 다음과 같습니다. 08 Long은 PHP입니다! PHP 프로그래밍은 매우 중요합니다. 동일한 값을 가진 변수가 unset()에 의해 삭제되면 다른 변수는 이 상황에 적용되지 않습니다. 즉, 함께 삭제되지 않습니다. . */
?>




09 $short는 PHP 프로그래밍이 최고입니다!
10 Long은 PHP를 프로그래밍하고 있습니다!




$big_long_variable_name.="웹 프로그래밍 $short"; /* 변수 $big_long_variable_name이 재할당됩니다. 이 때 전체 값은 PHP가 되어야 합니다. PHP 프로그래밍은 훌륭합니다!. $short 변수의 값은 이제 $big_long_variable_name 변수와 일치합니다. 분석을 위해 각각 참고 5와 10을 참조하십시오. */
print "11 /$short is $short"; /* 출력:11 PHP는 훌륭합니다!PHP 프로그래밍은 훌륭합니다!웹 프로그래밍 PHP는 훌륭합니다! PHP 프로그래밍은 훌륭합니다 */
print "12 Long은 $big_long_variable_name입니다";
?>




unset($big_long_variable_name); /* $big_long_variable_name 변수를 삭제하려면 unset()을 사용하세요. $short 변수는 어떤 방식으로도 영향을 받지 않습니다. */
print "13 /$short is $short"; /* 변수 $big_long_variable_name이 소멸되더라도 $short는 영향을 받지 않으며 해당 값은 여전히 ​​마지막으로 할당된 값입니다. PHP가 흔들립니다!PHP 프로그래밍이 흔들립니다!웹 프로그래밍 PHP가 흔들립니다!PHP 프로그래밍 좋아요! */
print "14 Long은 $big_long_variable_name입니다."; /* 변수 $big_long_variable_name이 삭제되었으므로 값이 없습니다. 출력: 14 Long */
눈; ?>




print "15 /$short는 $short입니다." /* 출력: 15 $short는 포인트가 없습니다. */
$short="포인트 없음 TEST2 $short"; /* $short 변수를 다시 할당합니다. $short 뒤에는 .(점)이 추가되지만 최신 값인 "No point TEST1"이 인용됩니다. */
print "16 /$short는 $short입니다." /* 출력:16 $short는 포인트 없음 TEST2 포인트 없음 */


이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿