PHP 변수 참조 및 변수 소멸 메커니즘에 대한 자세한 설명

墨辰丷
풀어 주다: 2023-03-28 12:06:02
원래의
1291명이 탐색했습니다.

변수는 PHP에서 매우 중요한 유형입니다. 모든 데이터는 변수 또는 상수를 통해 작동됩니다. 변수 참조 및 변수 파괴를 살펴보겠습니다. 필요한 친구는

php 변수 참조 및 변수 파괴 메커니즘

을 참조할 수 있습니다. PHP에서 "&" 기호는 참조를 나타냅니다.

1 다음과 같이 인용하지 않고 상황을 살펴보십시오.

$a = “hello world”;//定义一个变量,下面赋值给$b
$b = $a;//这一步没有在$a之前加符号&,像这样子”$b= & $a”。没有加&,实际上原理是会将变量$a复制拷贝一份,也就是内存中重新申请一个地址存储变量$b了
로그인 후 복사

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

2. 참조용으로 & 기호를 사용하세요

$a = “hello world”;
$b = & $a;
로그인 후 복사

참조를 사용하면 PHP 엔진은 실제로 변수를 메모리에 있는 $a의 주소로 가리키게 됩니다. $b 이 포인터가 저장됩니다.
참조를 사용할 때 $b의 값을 변경하면 $a도 그에 따라 변경됩니다

예:

$a = “hello world”;
$b = & $a;
$b = “test new value”;//把b的值改掉,a的值也会跟着改变
echo $a;//输出test new value,因为改变了b的值也会改变a的值。
=====================================
经常在定义函数的时候看到像这样的情况:
function test (& $param)
{
//函数定义的内容
$param++;
}
로그인 후 복사

설명: $param 앞에 참조가 있으므로 매개변수가 전달되었습니다. in은 메모리에 복사본을 만들지 않고 원래 메모리 공간을 직접 참조합니다. 따라서 & 기호를 사용하여 전달된 변수 값이 수정되면 원래 메모리 공간의 값도 변경됩니다.

다음과 같이 테스트해 보세요.

$k = 8;
test($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를 삭제하는 문제가 발생하는 것을 방지하기 위한 것입니다.

<?php
$a = &#39;d&#39;;
$b = & $a;
$b = 8;//因为是引用了,所以把b的值改掉,a的值也跟着改为8了。
var_dump($b,$a);
unset($b);//调用unset删除b变量,a变量不会删除
var_dump($b,$a);//输出null和8
?>
로그인 후 복사

$b 변수를 삭제하기 위해 unset을 호출하면 변수 기호 테이블에서 발견된 PHP 엔진: 내가 삭제하려는 변수 $b는 원래 $a 변수를 참조하고 있는데 삭제가 쉽지 않습니다. 일단 삭제하면 $a 변수가 사라지기 때문에 먼저 $a 변수의 복사본을 만든 다음 $b 변수를 삭제하세요.

PHP 기호 테이블 정보: 사실 제가 이해한 바에 따르면 작업 중 모든 변수 이름은 여기에 기록되고 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的值为"PHP",等同于$short=& $$long; */
print "01 /$short is $short.";  /* "/$"是转义序列,表示输出一个美元符号$,下同。本语句的作用是输出:01 $short is PHP. */
print "02 Long is $big_long_variable_name."; /* 输出:02 Long is PHP. */
?>
<br />
<br />
<?php $big_long_variable_name.=" rocks!"; /* 重新对$big_long_variable_name赋值。重新赋值过程中,由于在$big_long_variable_name的后面添加了.(点号),因而变量$big_long_variable_name此时的值应为原值("PHP")+新值(" rocks!"),即变量$big_long_variable_name当前完整的值为"PHP rocks!"。下同。*/
print "03 /$short is $short";  /* 输出:03 $short is PHP rocks! */
print "04 Long is $big_long_variable_name"; /* 输出:04 Long is PHP rocks! */
?>
<br />
<br />
05 $short is PHP rocks!
06 Long is PHP rocks!
<br />
<br />
<?php $short.="Programming $short";  /* 重新对变量$short赋值。由于在$short后面添加了.(点号),因此请参考上例分析$short的值。*/
print "07 /$short is $short";  /* 输出:07 $short is PHP rocks!Programming PHP rocks! */
print "08 Long is $big_long_variable_name"; /* 由于变量$short被重新赋值为Programming PHP rocks!,因而变量$big_long_variable_name的值也与$short一同被改变为"PHP rocks!Programming PHP rocks!"。本语句输出:08 Long is PHP rocks!Programming PHP rocks!注意,如果是对具有相同值的一个变量进行销毁unset( ),则另一个变量不适用于此种情况,即不会随之被一同销毁。*/
?>
<br />
<br />
09 $short is Programming PHP rocks!
10 Long is Programming PHP rocks!
<br />
<br />
<?php $big_long_variable_name.="Web Programming $short"; /* 变量$big_long_variable_name被重新赋值,此时它完整的值应为PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks!。变量$short的值此时与变量$big_long_variable_name一致。请分别参考第5处、第10处注释进行分析。*/
print "11 /$short is $short";   /* 输出:11 PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks! */
print "12 Long is $big_long_variable_name";
?>
<br />
<br />
<?php
unset($big_long_variable_name);  /* 用unset( )销毁变量$big_long_variable_name,变量$short不会因此受到任何影响。*/
print "13 /$short is $short";  /* 虽然销毁了变量$big_long_variable_name,但$short没有受到影响,它的值仍是最近一次被赋予的PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks! */
print "14 Long is $big_long_variable_name."; /* 变量$big_long_variable_name已被销毁,故而无值。输出:14 Long is. */
snow;                  
?>
<br />
<br />
<?php $short="No point TEST1";  /* 重新对变量$short赋值。由于这次没有在$short后面添加.(点号),因此$short当前的值为"No point TEST1"。*/
print "15 /$short is $short.";  /* 输出:15 $short is No point TEST1. */
$short="No point TEST2 $short";  /* 重新对变量$short赋值。没在$short的后面添加.(点号),但引用了它自身最近一次的值"No point TEST1"。*/
print "16 /$short is $short.";  /* 输出:16 $short is No point TEST2 No point TEST1. */
로그인 후 복사

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다.


관련 추천:

PHP 파일 업로드 관련 지식 및 응용

PHP 루프 - While 루프 이해 및 사용

PHP 5개의 echo 및 print 문

관련 지식 및 응용

위 내용은 PHP 변수 참조 및 변수 소멸 메커니즘에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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