이 글에서는 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 프로그래밍 설계에 도움이 되기를 바랍니다.