developer tip

PHP 경고 : 호출 시간 참조에 의한 전달이 더 이상 사용되지 않습니다.

optionbox 2020. 10. 26. 07:55
반응형

PHP 경고 : 호출 시간 참조에 의한 전달이 더 이상 사용되지 않습니다.


Call-time pass-by-reference has been deprecated다음 코드 줄에 대한 경고가 표시됩니다 .

function XML() {
    $this->parser = &xml_parser_create();
    xml_parser_set_option(&$this->parser, XML_OPTION_CASE_FOLDING, false);
    xml_set_object(&$this->parser, &$this);
    xml_set_element_handler(&$this->parser, 'open','close');
    xml_set_character_data_handler(&$this->parser, 'data');
}
function destruct() {
    xml_parser_free(&$this->parser);
}
function & parse(&$data) {
    $this->document = array();
    $this->stack    = array();
    $this->parent   = &$this->document;
    return xml_parse(&$this->parser, &$data, true) ? $this->document : NULL;
}

원인은 무엇이며 어떻게 해결합니까?


제거 &에서 &$this모든 곳에서, 그것은 필요하지 않습니다. 사실, &이 코드의 모든 부분을 제거 할 수 있다고 생각합니다 . 전혀 필요하지 않습니다.

긴 설명

PHP는 "값"과 "참조"라는 두 가지 방법으로 변수를 전달할 수 있습니다. 첫 번째 방법 ( "값별")은 수정할 수없고 다른 두 번째 방법 ( "참조 별")은 다음과 같이 할 수 있습니다.

     function not_modified($x) { $x = $x+1; }
     function modified(&$x) { $x = $x+1; }

&기호에 유의 하십시오. modified변수를 호출 하면 변수가 수정되고를 호출 not_modified하면 인수 값이 반환 된 후 동일합니다.

이전 버전의 PHP에서는 다음을 수행 modified하여 with의 동작을 시뮬레이션 할 수 있습니다.. 이것은 "참조에 의한 통화 시간 전달"입니다. 더 이상 사용되지 않으며 사용해서는 안됩니다.not_modifiednot_modified(&$x)

또한 매우 오래된 PHP 버전 (읽기 : PHP 4 이하)에서 객체를 수정하면 참조로 전달해야하므로 &$this. 객체는 함수에 전달 될 때 항상 수정되므로 더 이상 필요하지도 권장되지도 않습니다. 즉, 다음과 같이 작동합니다.

   function obj_modified($obj) { $obj->x = $obj->x+1; }

이것은 $obj->x공식적으로 "값으로"전달 되더라도 수정 되지만 전달되는 것은 PHP 4에서와 같이 객체의 사본이 아닌 객체 핸들 (예 : Java 등)입니다.

즉, 이상한 일을하지 않는 한 객체를 전달할 필요가 거의 없습니다 (따라서 $this참조로 호출 시간이든 그렇지 않든). 특히 코드에는 필요하지 않습니다.


궁금한 점이 있다면 참조에 의한 호출 시간 전달은 PHP 느슨한 입력을 촉진하는 더 이상 사용되지 않는 PHP 기능입니다. 기본적으로 특별히 요청하지 않은 함수에 대한 참조 (C 포인터와 같은 종류)를 전달할 수 있습니다. 둥근 구멍 문제에서 사각형 못에 대한 PHP의 솔루션입니다.
당신이 경우에, 결코 참조하지 $this. 클래스 외부에서 참조 $this는 개인 메서드 및 필드에 액세스하는 것을 허용하지 않습니다.

예:

<?php
function test1( $test ) {} //This function doesn't want a reference
function test2( &$test ) {} //This function implicitly asks for a reference

$foo = 'bar';
test2( $foo ); //This function is actually given a reference
test1( &$foo ); //But we can't force a reference on test1 anymore, ERROR
?>

참고 URL : https://stackoverflow.com/questions/4665782/php-warning-call-time-pass-by-reference-has-been-deprecated

반응형