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_modified
not_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
?>
'developer tip' 카테고리의 다른 글
RuboCop : 줄이 너무 깁니다. <— 무시하는 방법 (0) | 2020.10.26 |
---|---|
C ++ 네임 스페이스 조언 (0) | 2020.10.26 |
moment.js isValid 함수가 제대로 작동하지 않습니다. (0) | 2020.10.26 |
컨트롤러별로 다른 컨트롤러의 부분보기를 반환하는 방법은 무엇입니까? (0) | 2020.10.26 |
TextInputLayout 오류 메시지 색상을 설정하는 방법은 무엇입니까? (0) | 2020.10.26 |