>  기사  >  참조 및 PHP의 진정한 이해 - 변수 참조, 함수 참조, 객체 참조

참조 및 PHP의 진정한 이해 - 변수 참조, 함수 참조, 객체 참조

无忌哥哥
无忌哥哥원래의
2018-06-27 15:49:471844검색

변수 참조
PHP 참조를 사용하면 두 개의 변수를 사용하여 동일한 내용을 지정할 수 있습니다.

<?php
$a="ABC"; 
$b =&$a; 
echo $a;//这里输出:ABC 
echo $b;//这里输出:ABC 
$b="EFG"; 
echo $a;//这里$a的值变为EFG 所以输出EFG 
echo $b;//这里输出EFG 
?>

함수의 주소별 호출에 대해서는 자세히 설명하지 않겠습니다. 코드는

<?php
function test(&$a){ 
    $a=$a+100; 
} 
$b=1; 
echo $b;//输出1 
test($b);   //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了 
echo "<br>"; 
echo $b;//输出101
?>
바로 아래에 있습니다.

여기에서 test(1);을 사용하면 오류가 발생합니다. 이유는 다음과 같습니다. PHP는 전달된 참조가 상수일 수 없다고 규정합니다(오류 메시지 참조).

함수 참조 반환 먼저 코드를 살펴보세요

<?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(); 얻는 것은 실제로 함수 참조 반환이 아니며, 이는 일반 함수 호출과 다르지 않습니다. 이유: 이것은 PHP입니다. PHP는 $a=&test(); 를 통해 얻은 것이 함수의 참조 반환이라고 규정합니다. 참조 반환은 무엇입니까? (PHP 매뉴얼에서는 다음을 사용하려고 할 때 사용됩니다. 참조가 바인딩되어야 하는 위치를 찾는 함수입니다. ) 이 말도 안되는 내용을 설명하기 위해 위의 예를 사용하면 $a=test() 를 사용하여 함수를 호출할 뿐입니다. $a에 대한 함수 값은 $a에 영향을 주지 않습니다. $a=&test()를 통해 함수를 호출하면 해당 함수는 $b 변수의 메모리 주소를 가리킵니다. $b를 $a 변수의 메모리 주소로 반환하면 동일한 위치가 생성되며 이는 이 효과($a=&b;)와 동일하므로 $a 값을 변경하면 $b 값도 변경됩니다. $a=&test(); $a=5; 를 실행하면 $b의 값은 5가 됩니다

이것은 정적 변수를 사용하기 전에 함수의 참조 반환을 모두가 이해할 수 있도록 하기 위한 것입니다. 대부분 객체에 사용됩니다

객체 참조

<?php
class a
{ 
   var $abc="ABC";
}
$b=new a; $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; $c=&$b; 와 동일합니다. PHP5의 기본값은 참조로 객체를 호출하는 것입니다. 객체를 만들고 싶고 원본 객체의 변경 사항이 사본에 영향을 미치지 않기를 바랍니다. 이를 위해 PHP는 __clone이라는 특수 메서드를 정의합니다.

참조의 역할

프로그램이 상대적으로 큰 경우 , 같은 객체의 변수를 참조하는 경우가 많고, 객체를 사용한 후 수동으로 삭제하고 싶을 경우 개인적으로 "&" 방법을 사용한 다음 $var=null 을 사용하여 삭제하는 것을 권장합니다. php5의 기본 방법입니다. 또한 php5의 큰 배열의 경우 전송 시 "&" 방법을 사용하는 것이 좋습니다. 이는 결국 메모리 공간을 절약하기 때문입니다.


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

115c9d6bf06c9f77722327e460010e96

는 $b를 설정 해제하지 않고 $a만 설정합니다. function quoteTest(){ global $var; //$var = &$GLOBALS['var']; unset($var); //삭제는 참조만 삭제하지만 참조된 내용은 여전히 ​​존재합니다. 변수 내용이 파괴되었다는 의미는 아닙니다.}$var=1;quoteTest();echo $var; // 결과 1

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

$b는 설정 해제되지 않고 $a만 설정 해제됩니다.

function quote(){ global $var; //$var = &$GLOBALS['var'] $var = 5; //둘 다 동일한 메모리 내용을 가리키기 때문입니다.}$var=1;quoteTest () ;echo $var; //결과 5------------------------- -- ------------------------------------------------ -- ---

'&' 이것은 참조입니다

전역 참조 전역 $var로 변수를 선언하면 실제로 전역 변수에 대한 참조가 설정됩니다. 이는 다음과 같습니다:

7e359611169106611ed41c10319e095a

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

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

//여기 또 다른 작은 에피소드가 있습니다. PHP의 주소 지정(포인터와 유사) 기능은 사용자가 직접 구현하는 것이 아니라 Zend 코어에서 구현하는 것입니다. -write", 즉 쓰기 작업이 발생하지 않는 한 동일한 주소를 가리키는 변수나 개체는 복사되지 않습니다.

일반인의 관점에서 1: 다음 코드가 있는 경우 [php] $a="ABC"; $b=$a [/php] 사실 이때 $a와 $b는 모두 동일한 메모리를 가리킵니다. $a와 $b가 아닌 주소가 다른 메모리를 차지합니다

2: 위 코드에 다음 코드를 추가하면 [php] $a="EFG" [/php] $a가 가리키는 메모리의 데이터가 있으므로; 그리고 $b 이제 다시 쓸 시간입니다. 이때 Zend 코어는 $b에 대한 $a의 데이터 복사본을 자동으로 결정하고 자동으로 생성하고 저장용 메모리 조각을 다시 신청합니다

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.