>  기사  >  백엔드 개발  >  PHP 인용문 설명

PHP 인용문 설명

伊谢尔伦
伊谢尔伦원래의
2016-11-22 11:20:37951검색

참조란 무엇인가요?

PHP에서 인용이란 동일한 변수 내용에 다른 이름으로 액세스하는 것을 의미합니다. 이는 C 포인터와는 다릅니다. 대신 참조는 기호 테이블 별칭입니다. PHP에서는 변수 이름과 변수 내용이 다르기 때문에 동일한 내용이라도 다른 이름을 가질 수 있습니다. 가장 가까운 비유는 Unix의 파일 이름과 파일 자체입니다. 변수 이름은 디렉토리 항목이고 변수 내용은 파일 자체입니다. 참조는 Unix 파일 시스템의 하드링크로 간주될 수 있습니다.

참조의 역할

PHP의 참조를 사용하면 두 변수가 동일한 내용을 가리킬 수 있습니다. 의미:

<?php
    $a =& $b;
?>

$a와 $b가 동일한 변수를 가리킨다는 의미입니다.

참고:

여기서 $a와 $b는 완전히 동일합니다. $a가 $b를 가리키거나 그 반대도 아니지만 $a와 $b가 같은 위치를 가리킵니다. .

참고:

참조가 있는 배열을 복사해도 해당 값은 역참조되지 않습니다. 배열 값을 함수에 전달할 때도 마찬가지입니다.

참고:

정의되지 않은 변수가 참조로 할당되거나 참조 매개변수로 전달되거나 참조로 반환되면 변수가 자동으로 생성됩니다.

예제 #1 정의되지 않은 변수에 대한 참조 사용

<?php
    function foo(&$var) { }
    foo($a); // $a is "created" and assigned to null
    $b = array();
    foo($b[&#39;b&#39;]);
    var_dump(array_key_exists(&#39;b&#39;, $b)); // bool(true)
    $c = new StdClass;
    foo($c->d);
    var_dump(property_exists($c, &#39;d&#39;)); // bool(true)
?>

참조를 반환하는 함수와 new 연산자(PHP 4.0.4 이상 버전)에서 동일한 구문을 사용할 수 있습니다. :

<?php
    $bar =& new fooclass();
    $foo =& find_var($bar);
?>

PHP 5부터 new는 자동으로 참조를 반환하므로 여기서 =&를 사용하는 것은 더 이상 사용되지 않으며 E_STRICT 수준 메시지를 생성합니다.

참고:

& 연산자를 사용하지 않으면 객체의 복사본이 생성됩니다. 클래스에서 $this를 사용하면 클래스의 현재 인스턴스에 적용됩니다. &가 없는 할당은 인스턴스(예: 개체)를 복사하고 $this는 복사본에 적용되지만 항상 원하는 결과는 아닙니다. 성능 및 메모리 소비 문제로 인해 일반적으로 하나의 인스턴스에서만 작업하려고 합니다.

@new와 같은 @ 연산자를 사용하여 생성자에서 오류 메시지를 표시하지 않을 수 있지만 &new 문을 사용할 때는 아무런 효과가 없습니다. 이는 Zend 엔진의 제한 사항이며 구문 분석 오류가 발생합니다.

경고 함수 내에서 전역으로 선언된 변수에 참조가 할당되면 해당 참조는 함수 내에서만 표시됩니다. $GLOBALS 배열을 사용하면 이 문제를 피할 수 있습니다.

예제 #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 &#39;$var2&#39;\n"; // var2 is set to &#39;&#39;
    global_references(true);
    echo "var2 is set to &#39;$var2&#39;\n"; // var2 is set to &#39;Example variable&#39;
?>

전역 $var;을 $var =& $GLOBALS['var'];의 약어로 취급합니다. 따라서 $var에 다른 참조를 할당하면 지역 변수의 참조만 변경됩니다.

참고:

foreach 문에서 참조가 있는 변수에 값을 할당하면 참조된 개체도 변경됩니다.

예제 #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"] 위에 설정하세요. 함수 foo에는 $bar 변수가 없기 때문에 참조 메커니즘을 통해 $bar를 함수 호출 범위의 다른 변수에 바인딩할 수 없습니다($var로 표시되지만 $var에는 변수 내용만 있고 호출은 없습니다). 기호 테이블 이름-값 바인딩). 함수에 의해 선택된 참조 변수에 대한 참조 반환을 사용할 수 있습니다.


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