PHP 참조

巴扎黑
풀어 주다: 2016-11-23 13:15:11
원래의
1025명이 탐색했습니다.

PHP에서 소위 참조라는 것은 서로 다른 이름이 동일한 변수 내용에 액세스한다는 것을 의미합니다. 변수, 함수, 객체 앞에 앰퍼샌드를 추가하여 사용할 수 있습니다. 참조의 종류와 기능에 대해 자세히 알아보겠습니다.

1. 참조의 종류

1.1. 변수 2개가 같은 내용을 가리킵니다

PHP 코드

<?php  
  $a = "abc";   
  $b = &$a;   
  echo $a;//这里输出:abc   
  echo $b;//这里输出:abc   
    
  $b = "done";   
  echo $a;//这里$a的值变为done, 所以输出done   
  echo $b;//这里输出done  
?>
로그인 후 복사


1.2. 함수 전송 참고

PHP 코드

function test(&$a)  
{  
    $a=$a+100;   
}  
  
$b=1;  
  
test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值,就可以改变$b的值了   
  
echo $b;//输出101
로그인 후 복사

여기서 테스트(1)이 잘못될 것입니다. 이유를 직접 생각해 보세요

1.3, 함수 참조

Php 코드

function &test()   
{  
    static $b=0;//申明一个静态变量  
    $b=$b+1;  
    echo $b;  
    return $b;  
}  
  
$a=test();//$b的值:1  
  
$a=5;  
$a=test();//$b的值:2  
  
$a=&test();//$b的值:3  
  
$a=5;  
$a=test();//$b的值:6
로그인 후 복사

가 설명되어 있습니다. 다음과 같이 :
$a=test()를 사용하여 함수를 호출하면 함수의 값이 $a에만 할당되며 $a에 대한 변경 사항은 함수의 $b에 영향을 미치지 않습니다. 함수를 호출할 때 해당 함수는 return $b에서 $b 변수의 메모리 주소와 $a 변수의 메모리 주소를 동일한 위치로 가리키는 것입니다. 이는 이 효과와 동등한 결과를 생성합니다($a=&b;) 따라서 $a 값을 변경하면 $b 값도 변경되므로


$a=&test()
$a=5;


이후 $b의 값은 5가 됩니다.

여기서는 함수 참조 리턴의 이해를 돕기 위해 정적 변수를 사용합니다. 실제로 함수 참조 리턴은 대부분 객체에서 사용됩니다

1.4.객체 참조

PHP 코드

class testa  
{  
    var $abc="ABC";   
}  
  
$b=new testa;  
$c = &$b; // or $c = $b;  
echo $b->abc;//这里输出ABC   
echo $c->abc;//这里输出ABC   
$b->abc="DEF";   
echo $c->abc;//这里输出DEF
로그인 후 복사

위 코드는 PHP5의 실행 효과입니다.
PHP5에서는 객체를 복사합니다. 참조를 통해 달성됩니다. 위의 예에서 $b=new a; $c=$b; 는 $b=new a;
PHP5의 기본값은 참조로 객체를 호출하는 것입니다. 개체의 복사본을 만들고 원본 개체에 대한 변경 사항이 복사본에 영향을 미치지 않기를 바랄 수 있습니다. 이를 위해 PHP는 __clone이라는 특수 메소드를 정의합니다.

2. 참조의 역할


프로그램의 규모가 상대적으로 크다면 동일한 객체를 참조하는 변수를 많이 비교하고, 개체를 사용한 후 수동으로 개체를 지우고 싶은 경우 개인적으로 "&" 방법을 사용한 다음 $var=null을 사용하여 개체를 지우는 것이 좋습니다. 다른 경우에는 php5의 기본 방법을 사용하십시오. 또한, php5에서 큰 배열을 전송하려면 "&" 방법을 사용하는 것이 좋습니다. 결국 메모리 공간이 절약되기 때문입니다.

3. 참조 해제


참조를 설정 해제하면 변수 이름과 변수 내용 간의 바인딩이 끊어집니다. 이는 변수 내용이 삭제된다는 의미는 아닙니다. 예를 들어,

<?php 
   $a = 1; 
   $b =& $a; 
   unset ($a); 
?>
로그인 후 복사

은 $b를 설정 해제하지 않고 $a만 삭제합니다.

또 다른 예는 전역 참조입니다. global $var로 변수를 선언하면 실제로 전역 변수에 대한 참조가 설정됩니다.

<?php 
    $var =& $GLOBALS["var"]; 
?>
로그인 후 복사

이는 예를 들어 unset $var가 전역 변수를 설정 해제하지 않는다는 것을 의미합니다.

$this 참조: 객체의 메서드에서 $this는 항상 이를 호출하는 객체에 대한 참조입니다.

PS:

PHP의 한 가지 장점은 자동 가비지 수집 메커니즘(메모리 해제)을 활용할 수 있다는 것입니다. 즉, 변수를 사용한 후 메모리를 해제하기 위해 어떤 처리도 수행할 필요가 없으며 PHP가 이를 수행합니다. 물론 원한다면 unset() 함수를 호출하여 메모리를 해제할 수 있지만 일반적으로 그럴 필요는 없습니다.


그러나 PHP에서는 다음과 같이 메모리가 자동으로 해제되지 않는 상황이 적어도 한 가지 있습니다.


있는 경우 두 개체 사이의 간격 "부모 개체-자식 개체"와 같은 상호 참조 관계에서 부모 개체에 대해 unset()을 호출하면 자식 개체에서 부모 개체를 참조하는 메모리가 해제되지 않습니다(부모 개체가 가비지인 경우에도). 모은).


이때는 unset()을 수동으로 호출하더라도 마찬가지입니다. 자세한 내용은 http://bugs.php.net/bug.php?id=33595에서 확인할 수 있습니다.

unset() 함수의 객체에서 __destruct() 메서드를 호출하는 것이 절충안입니다.


---------------------------------- -- -----------

보충:


PHP에서 주소의 포인팅(포인터와 유사) 기능은 사용자가 직접 구현하는 것이 아니라 Zend 코어에 의해 구현됩니다. PHP의 참조는 "쓰기 시 복사" 원칙을 채택합니다. 즉, 쓰기 작업이 발생하지 않으면 동일한 주소를 가리키는 변수나 개체가 복사되지 않습니다.

일반 용어로
1: 다음 코드가 있는 경우

$a="ABC";
$b=$a; 이때 $a와 $b가 서로 다른 메모리를 차지하는 것이 아니라 $a와 $b가 모두 동일한 메모리 주소를 가리키고 있습니다

2: 위 코드에 다음 코드를 추가하면

$a="EFG";

$a와 $b가 가리키는 메모리의 데이터를 다시 작성해야 하므로 Zend 코어는 $b에 대한 $a의 데이터를 자동으로 판단하고 생성합니다. .저장할 메모리를 복사하고 다시 적용합니다.

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