PHP 의 인용 상세 설명

9880 단어 PHP인용 하 다.
인용 은 무엇 입 니까
PHP 에서 인용 하 는 것 은 같은 변수 내용 에 다른 이름 으로 접근 하 는 것 을 의미 합 니 다.이것 은 C 의 지침 과 달리 인용 은 기호 표 별명 이다.PHP 에 서 는 변수 이름과 변수 내용 이 다 르 기 때문에 같은 내용 에 다른 이름 이 있 을 수 있 습 니 다.가장 가 까 운 비 유 는 유 닉 스 의 파일 이름과 파일 자체 인 변수 이름 은 디 렉 터 리 항목 이 고 변수 내용 은 파일 자체 입 니 다.인용 은 유 닉 스 파일 시스템 의 hardlink 로 볼 수 있 습 니 다.
뭐 공부 해요?
PHP 의 인용 은 같은 내용 을 두 변수 로 가리 킬 수 있 습 니 다.이렇게 할 때

<?php
$a =& $b;
?>
이것 은$a 와$b 가 같은 변 수 를 가리 키 는 것 을 의미 합 니 다.
Note:
$a 와$b 는 여기에서 완전히 같 습 니 다.이것 은$a 가$b 를 가리 키 거나 반대 하 는 것 이 아니 라$a 와$b 가 같은 곳 을 가리 키 는 것 입 니 다.
Note:
인 용 된 배열 이 복사 되면 그 값 은 인용 을 해제 하지 않 습 니 다.배열 의 값 을 함수 에 전달 하 는 것 도 마찬가지다.
Note:
정의 되 지 않 은 변 수 를 참조 할당,참조 매개 변수 전달 또는 참조 되 돌려 주면 자동 으로 변 수 를 만 듭 니 다.
Example\#1 정의 되 지 않 은 변수 에 대한 참조 사용

<?php
function foo(&$var) { }
foo($a); // $a is "created" and assigned to null
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
같은 문법 은 함수 에 사용 할 수 있 습 니 다.인용 을 되 돌려 주 고 new 연산 자 에 사용 할 수 있 습 니 다(PHP 4.0.4 및 이후 버 전).

<?php
$bar =& new fooclass();
$foo =& find_var($bar);
?>
PHP 5 부터 new 는 자동 으로 인용 을 되 돌려 줍 니 다.따라서 여기 서 사용=&시간 이 지 났 고 E 가 발생 합 니 다.STRCT 급 소식 입 니 다.
Note:
아 닙 니 다&연산 자 는 대상 에 게 복사 본 을 만 들 었 습 니 다.클래스 에$this 를 사용 하면 현재 인 스 턴 스 에 사 용 됩 니 다.이 인 스 턴 스(예 를 들 어 대상)를 복사 하고$this 는 이 복사 에 사 용 됩 니 다.항상 원 하 는 결 과 는 아 닙 니 다.성능 과 메모리 소모 문제 로 인해 보통 하나의 인 스 턴 스 에서 만 일 하고 싶 습 니 다.
@연산 자 를 사용 하여 구조 함수 의 잘못된 정 보 를 억제 할 수 있 습 니 다.예 를 들 어@new 를 사용 하지만&new 문 구 를 사용 할 때 효과 가 없습니다.이것 은 Zend 엔진 의 제한 이 며 해석 오 류 를 초래 할 수 있 습 니 다.
Warning
함수 내부 에서 global 로 설 명 된 변수 에 인용 을 부여 하면 이 인용 은 함수 내부 에서 만 볼 수 있 습 니 다.$GLOBALS 배열 을 사용 하여 이 점 을 피 할 수 있 습 니 다.
Example\#2 함수 에서 전역 변 수 를 참조 합 니 다.

<?php
$var1 = "Example variable";
$var2 = "";
function global_references($use_globals)
{
    global $var1, $var2;
    if (!$use_globals) {
        $var2 =& $var1; // visible only inside the function
    } else {
        $GLOBALS["var2"] =& $var1; // visible also in global context
    }
}
global_references(false);
echo "var2 is set to '$var2'
"; // var2 is set to ''
global_references(true);
echo "var2 is set to '$var2'
"; // var2 is set to 'Example variable'
?>
global$var;$var=&$GLOBALS[var']라 고 생각 합 니 다.라 고 약자 로 적 었 다.다른 인용 을$var 에 부여 하여 로 컬 변수의 인용 만 바 꾸 었 습 니 다.
Note:
foreach 구문 에서 인 용 된 변 수 를 할당 하면 인 용 된 대상 도 변 합 니 다.
Example\#3 참조 와 foreach 문장

<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
    // do something
}
echo $ref; // 3 - last element of the iterated array
?>
인용 으로 하 는 두 번 째 일 은 인용 으로 변 수 를 전달 하 는 것 이다.이것 은 함수 내 에 로 컬 변 수 를 만 들 고 이 변 수 는 호출 범위 내 에서 같은 내용 을 인용 하여 이 루어 진 것 입 니 다.예 를 들 면:

<?php
function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
?>

$a 를 6 으로 변환 합 니 다.이것 은 foo 함수 에서 변수$var 가$a 와 같은 내용 을 가리 키 기 때 문 입 니 다.더 자세 한 설명 은 인용 전달 참조.
인용 이 한 세 번 째 일 은 인용 반환 이다.
인용 은 아무것도 아니에요.
앞에서 말 한 바 와 같이 인용 은 지침 이 아니다.이것 은 아래 의 구조 가 기대 하 는 효과 가 나타 나 지 않 는 다 는 것 을 의미한다.

<?php
function foo(&$var)
{
    $var =& $GLOBALS["baz"];
}
foo($bar);
?>
이것 은 foo 함수 의$var 변 수 를 함수 호출 시$bar 와 연결 시 키 지만,이어서$GLOBALS["baz"]위 에 다시 연결 합 니 다.인용 체 제 를 통 해$bar 를 함수 호출 범위 내 에서 다른 변수 에 연결 할 수 없습니다.함수 foo 에 변수$bar 가 없 기 때 문 입 니 다.함수 가 선택 한 변 수 를 참조 하기 위해 서 인용 반환 을 사용 할 수 있 습 니 다.
인용 전달
하나의 변 수 를 인용 을 통 해 함수 에 전달 할 수 있 습 니 다.그러면 이 함수 가 매개 변수의 값 을 수정 할 수 있 습 니 다.문법 은 다음 과 같다.

<?php
function foo(&$var)
{
    $var++;
}
$a=5;
foo($a);
// $a is 6 here
?>
함수 호출 시 인용 기호 가 없 음 을 주의 하 십시오.함수 정의 에 만 있 습 니 다.함수 정의 만으로 도 인 자 를 인용 을 통 해 정확하게 전달 할 수 있 습 니 다.최근 버 전의 PHP 에서 foo(&$a)에&를 사용 하면;'Call-time pass-by-reference'는 시대 에 뒤떨어 졌 다 는 경 고 를 받 을 수 있다.
다음 내용 은 인용 을 통 해 전달 할 수 있다.
변수,예 를 들 어 foo($a)
foo(new foobar()와 같은 새로운 구문
함수 에서 되 돌아 오 는 참조,예 를 들 어:

<?php
function &bar()
{
    $a = 5;
    return $a;
}
foo(bar());
?>
상세 한 설명 은 인용 반환 을 보십시오.
다른 표현 식 은 인용 을 통 해 전달 할 수 없 으 며 결 과 는 정의 되 지 않 았 습 니 다.예 를 들 어 아래 에서 전 달 된 예 를 참조 하면 유효 하지 않 습 니 다.

<?php
function bar() // Note the missing &
{
    $a = 5;
    return $a;
}
foo(bar()); // PHP 5.0.5
foo($a = 5) // ,
foo(5) //
?>
이 조건 들 은 PHP 4.0.4 및 향후 버 전에 있 습 니 다.
인용 반환
인용 반환 은 함수 로 인용 이 어느 변수 에 연결 되 어야 하 는 지 찾 으 려 면 사용 합 니 다.리 턴 인용 으로 성능 을 향상 시 키 지 마 세 요.엔진 은 충분히 똑똑 해서 스스로 최적화 할 수 있 습 니 다.합 리 적 인 기술적 원인 이 있 을 때 만 인용 을 되 돌려 줍 니 다!인용 을 되 돌려 주 려 면 이 문법 을 사용 하 십시오:

<?php
class foo {
    public $value = 42;
    public function &getValue() {
        return $this->value;
    }
}
$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue;                // prints the new value of $obj->value, i.e. 2.
?>
이 예 에서 getValue 함수 가 되 돌아 오 는 대상 의 속성 은 복사 하 는 것 이 아니 라 인용 문법 이 없 는 것 과 같 습 니 다.
참고:매개 변수 전달 과 달리 여 기 는 두 곳 에서 모두&기 호 를 사용 해 야 합 니 다.일반적인 복사 가 아니 라 인용 이 라 고 지적 해 야 합 니 다.또한$my Value 는 일반적인 할당 이 아니 라 인용 으로 연결 되 어야 합 니 다.
주:함수 에서 인용 을 되 돌려 주 려 면:return($this->value);이것 은 인용 변수 가 아 닌 표현 식 의 결 과 를 되 돌려 주 려 고 시도 하기 때문에 작용 하지 않 을 것 입 니 다.함수 에서 만 인용 변 수 를 되 돌려 줄 수 있 습 니 다.다른 방법 은 없습니다.코드 가 동적 표현 식 이나 new 연산 자의 결 과 를 되 돌려 주 려 고 하면 PHP 4.4.0 과 PHP 5.1.0 부터 E 를 보 냅 니 다.NOTICE 오류.

<?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 에 영향 을 주지 않 습 니 다.$a=&test()방식 으로 함 수 를 호출 합 니 다.그의 역할 은 return$b 의$b 변수의 메모리 주소 와$a 변수의 내 저장 주 소 를 같은 곳 으로 가리 키 는 것 입 니 다.즉,이러한 효과($a=&b;)에 해당 합 니 다.그래서$a 의 값 을 바 꾸 고$b 의 값 을 동시에 바 꾸 었 기 때문에$a=&test()를 실 행 했 습 니 다.$a=5; 이후$b 의 값 은 5 로 변 합 니 다.
인용 취소
unset 참조 가 있 을 때 변수 이름과 변수 내용 간 의 연결 만 끊 었 습 니 다.이것 은 변수의 내용 이 소각 되 었 다 는 것 을 의미 하지 않 는 다.예 를 들 면:

<?php
$a = 1;
$b =& $a;
unset($a);
?>
unset$b 는 아 닙 니 다.단지$a 입 니 다.
이것 과 유 닉 스 의 unlink 호출 을 비교 해 보면 이해 에 도움 이 될 수 있 습 니 다.
참조 위치
많은 PHP 의 문법 구 조 는 인용 체 제 를 통 해 이 루어 지기 때문에 상기 인용 바 인 딩 과 관련 된 모든 것 도 이러한 구조 에 적용 된다.일부 구조,예 를 들 어 인용 전달 과 반환 은 이미 위 에서 언급 되 었 다.다른 인용 구 조 는 다음 과 같 습 니 다.
전역 참조
global$var 로 변 수 를 설명 할 때 실제 적 으로 전역 변수 에 대한 인용 을 만 들 었 습 니 다.즉,이렇게 하 는 것 과 같다 는 것 이다.

<?php
$var =& $GLOBALS["var"];
?>
예 를 들 어 unset$var 는 unset 전역 변 수 를 사용 하지 않 습 니 다.
unset($a)를 사용 하면$a=null 과 결과 가 다 릅 니 다.이 메모리 에$a 맵 만 있 으 면 unset($a)와$a=null 등가 입 니 다.이 메모리 의 인용 수 는 0 으로 바 뀌 어 자동 으로 회 수 됩 니 다.이 메모리 에$a 와$b 두 개의 맵 이 있 으 면 unset($a)는$a=null 과$b 가 변 하지 않 는 상황 을 초래 하고$a=null 은$a=$b=null 의 상황 을 초래 합 니 다.
원인:특정한 변수 가 null 로 할당 되 어 이 변수 에 대응 하 는 메모리 블록 의 인용 수 를 0 으로 직접 설정 하여 자동 으로 회수 합 니 다.
$this
한 대상 의 방법 에서$this 는 영원히 대상 을 호출 하 는 인용 입 니 다.
인용 작용
프로그램 이 크 면 같은 대상 의 변 수 를 많이 참조 하고 이 대상 을 사용 한 후 손 으로 제거 하 기 를 원 합 니 다.개인 적 으로 는'&'방식 을 사용 한 다음$var=null 방식 으로 제거 하 는 것 을 권장 합 니 다.다른 때 는 phop 5 의 기본 방식 을 사용 하 십시오.또한 phop 5 에 서 는 큰 배열 의 전달 에 대해'&'방식 을 사용 하 는 것 을 권장 합 니 다.메모리 공간 을 절약 하기 때 문 입 니 다.
다음 에 피 소 드 는 php 에서 주소 에 대한 지향(포인터 와 유사)기능 은 사용자 가 스스로 실현 하 는 것 이 아니 라 Zend 핵심 으로 이 루어 진 것 입 니 다.php 에서 인용 한 것 은'쓸 때 복사'의 원리 입 니 다.즉,쓰기 동작 이 발생 하지 않 는 한 같은 주 소 를 가리 키 는 변수 나 대상 은 복사 되 지 않 습 니 다.
통속 적
1:아래 코드 가 있 으 면

<?ph
$a="ABC";
$b=$a;
?>
 사실 이 때$a 와$b 는 같은 메모리 주 소 를 가리 키 며$a 와$b 가 다른 메모 리 를 사용 하 는 것 이 아 닙 니 다.
2:위의 코드 에 다음 코드 를 더 하면

$a="EFG";
 $a 와$b 가 가리 키 는 메모리 의 데 이 터 를 다시 써 야 하기 때문에 Zend 핵심 은 자동 으로$b 로$a 의 데이터 복사 본 을 생산 하고 메모리 하 나 를 다시 신청 하여 저장 합 니 다.
이상 은 PHP 인용 에 관 한 모든 내용 입 니 다.마음 에 드 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기