php의 인용은 변수나 함수, 객체 등의 앞에 &부호를 붙이는 것이다
변수 참조
PHP 참조는 두 변수가 같은 것을 가리킬 수 있도록 합니다내용
<?php
$var1 = "fish";
$var2 = &$var1;
echo $var1; //여기서 출력: fish
echo $var2; //여기서 출력: fish
$var2 = "cat";
echo $var1; //여기서 $var1 값이 "cat"이 되니까 cat를 출력합니다
echo $var2; //여기서 cat를 출력합니다
?>
함수의 주소 호출
<?php
function foobar(&$arg){
$arg = $arg + 100;
}
$var = 1;
echo $var; //출력 1
/* 아래 $var가 함수 foobar에 전달한 사실은 $var의 변수 내용이 위치하는 메모리 주소이다
* 함수 안에서 $arg의 값을 변경함으로써 $var의 값을 변경할 수 있다
* 주의할 점은 여기에 foobar(1)라고 쓰면 틀리고,
* 이유는 PHP 규정상 전달된 인용은 상수가 될 수 없기 때문이다。
*/
foobar($var);
echo $var; //출력 101
?>
함수의 참조 반환
<?php
function &foobar() {
static $s = 0; //정적 변수 s를 설명하다
$s = $s + 1;
echo $s;
return $s;
}
$var = foobar(); //이 문구의 값은 입력된다. 1$ s
$var = 5; $var = foobar(); //이 문장은 $s의 값을 2로 출력할 것이다
$var = &foobar(); //이 문장은 $s의 값을 3으로 출력할 것이다
$var = 5; $var = foobar(); //이 문장은 $s의 값을 6으로 출력할 것이다
?>
이러한 방식으로 $var = foobar(); 결과적으로는 함수의 참조 반환이 아니며, 이는 일반적인 함수 호출과 다르지 않다.PHP는 $var = &foobar(;) 방식으로 얻는 것이 함수의 인용 반환이라고 규정한다.인용 반환이란 무엇입니까?(PHP 매뉴얼에 따르면, "참조 반환"은 함수를 사용하여 참조를 바인딩할 변수를 찾는 데 사용됩니다.)
$var = foobar( ); $var에 함수 값을 할당하는 방식으로 함수를 호출합니다. $var를 변경하면 함수의 $s에 영향을 주지 않습니다. $var = & foobar( ); $var f & foobar( ); 함수 호출은 return $s;에서 $s 변수의 메모리 주소와 $var 변수의 메모리 주소입니다.같은 곳을 가리키면 이와 같은 효과가 발생합니다($var = & $s;) 따라서 $var의 값을 변경해도 $s의 값을 변경하기 때문에 $var = &foobar(; $var = 5; 이후 $s의 값을 5로 변경합니다.
객체 참조
<?php
class Person {
public $name = "tony";
}
$p1 = new Person;
$p2 = $p1;
echo $p1->name; //여기 토니 출력
echo $p2->name; //여기 토니 출력
$p1->name = "jack";
echo $p2->name; //여기서 jack을 출력합니다
?>
PHP에서 객체는 인용에 의해 구현된다.
위의 $p1 = new Person; $p2 = $p1;
사실 $p1 = new Per와 동등합니다son; $p2 = &$p1;
PHP에서 기본적으로 개체를 호출하는 데 사용됩니다. 오브젝트의 복사본을 만들고 싶을 수도 있고 원본 오브젝트의 변경이 복사본에 영향을 미치지 않기를 원할 수도 있습니다. . 이러한 목적을 위해 PHP는 __clone이라고 불리는 특수한 방법을 정의한다.
인용하는 역할
만약 절차가 비교적 크다면, 인용은 같다.한 오브젝트에 변수가 많고, 해당 오브젝트를 사용한 후 수동으로 지우려면 '&'을 추천한다. 방식, 그리고 $var = null; 방식으로 지우고, 다른 때는 php로 지웁니다.기본 방식. 또한 php에서 큰 배열의 전달을 위해 메모리 공간을 절약하는 '&' 방식을 권장합니다.
참조 취소 unset에서 참조할 때변수 이름과 변수 내용 간의 바인딩만 끊었습니다.이것은 변수 내용이 없어졌다는 것을 의미하지는 않는다. 예:
<?php $var1 = 1; $var2 = &$var1; unset ($var1); ?>
unset $var2는 못하는데 그냥 unset $var1
function foobar() {
global $var; //$var = &$GLOBALS['var']에 해당됩니다;
unset($var); //삭제하고, 다만 인용한 삭제 내용을 인용해 아직도 존재하지는 않다는 게 변수다. 내용이 파기했다
}
$var=1;
foobar();
echo $var; //결과 1
function foobar() {
global $var; // $var = &$GLOBALS['var']; 같은 메모리 콘텐츠를 가리키기 때문에
$var = 5;
}
$var = 1;
foobar();
echo $var; //결과 5
'&' 이것이 바로 인용이다
global reference는 global $var로 변수를 선언할 때 글로벌 변수에 대한 레퍼런스를 실제로 설정한다.즉 이렇게 하는 것과 같은 것이다.
<?php $var =& $GLOBALS["var"]; ?>
이는 예를 들어 unset $var가 unset 글로벌 변수를 갖지 않는다는 것을 의미한다.
$this는 한 객체의 메소드에서 $this는 항상 그 객체의 참조를 호출한다.
php에서 주소에 대한 지향 기능은 사용자 자신이 아니라 Zend 코어에 의해 실현된다. php에서 인용한 것은 "쓰기 시 복사"의 원리, 아니면 보내지 않는 것이다.같은 주소를 가리키는 변수나 객체는 복사되지 않는다.
아래 코드 있으면 <?php $a="ABC"; $b=$a; ?> 이때 $a와 $b는 같은 메모리 주소이지 그렇지 않습니다. $a와 $b는 서로 다른 메모리를 사용합니다
위 코드에 아래와 같이 코드 <?php $a="EFG"; ?> $a와 $b가 가리키는 메모리의 데이터를 다시 써야 하기 때문에한 번, 이때 Zend 코어는 자동으로 판단하여 $b를 위해 $a의 수를 자동으로 생산한다.카피에 의하면, 메모리 한 조각을 다시 신청하여 저장한다
'개발 꿀팁 > PHP' 카테고리의 다른 글
PHP 시간 초과 처리 요약 (1) | 2022.09.14 |
---|---|
빠른 정렬을 위한 PHP (0) | 2022.09.14 |
composer를 이용한 자체 프로젝트 구축 (1) | 2022.09.13 |
PHP 손글씨 HTTP 프로토콜 (0) | 2022.09.13 |
PHPIO 프로그래밍 epoll 구현 방안 (0) | 2022.09.13 |