엄격한 표준 : 변수 만 참조로 전달해야합니다.
PHP엄격한 표준 : 변수 만 참조로 전달해야합니다.
$el = array_shift($instance->find(..))
위의 코드는 어떻게 든 엄격한 표준 경고를보고하지만 이것이 수행하지는 않습니다.
function get_arr(){
return array(1,2);
}
$el = array_shift(get_arr());
어쨌든 경고를 언제보고 할 예정입니까?
해결법
-
==============================
1.
다음 코드를 살펴보십시오.
error_reporting(E_STRICT); class test { function test_arr(&$a) { var_dump($a); } function get_arr() { return array(1,2); } } $t= new test; $t->test_arr($t->get_arr());
그러면 다음과 같은 출력이 생성됩니다.
Strict Standards: Only variables should be passed by reference in test.php on line 14 array(2) { [0]=> int(1) [1]=> int(2) }
이유? test :: get_arr () 메서드는 변수가 아니며 엄격 모드에서는 경고를 생성합니다. 이 동작은 get_arr () 메서드가 배열 값을 반환하므로 매우 직관적이지 않습니다.
엄격 모드에서이 오류를 해결하려면 메소드의 서명을 변경하여 참조를 사용하지 않도록하십시오.
function test_arr($a) { var_dump($a); }
array_shift의 서명을 변경할 수 없으므로 중간 변수를 사용할 수도 있습니다.
$inter= get_arr(); $el= array_shift($inter);
-
==============================
2.
$ instance-> find ()는 변수에 대한 참조를 반환합니다.
이 참조를 함수의 인수로 사용하려고하면 보고서를 가져옵니다. 변수에 먼저 저장하지 않아도됩니다.
이렇게하면 메모리 누수를 방지 할 수 있으며 다음 PHP 버전에서는 오류가 발생할 수 있습니다.
당신의 두 번째 코드는 다음과 같이 쓴다면 오류를 던질 것입니다 (& in 함수의 서명에주의하십시오) :
function &get_arr(){ return array(1,2); } $el = array_shift(get_arr());
그래서 빠른 (그리고 그렇게 좋지 않은) 수정은 다음과 같습니다 :
$el = array_shift($tmp = $instance->find(..));
기본적으로 임시 변수에 먼저 할당하고 변수를 인수로 보냅니다.
-
==============================
3.
에러의 원인은 내부 PHP 프로그래밍 데이터 구조 함수 인 array_shift () [php.net/end]의 사용입니다. 이 함수는 배열을 매개 변수로 사용합니다. "The Manual"의 "array_shift ()"프로토 타입에는 앰퍼샌드가 표시되어 있지만 해당 함수의 확장 된 정의에 이어지는주의 설명서가 없으며 매개 변수가 실제로 참조로 전달되었다는 명백한 설명도 없습니다. 이것은 / 이해하고 있습니다. 그러나 나는 이해하지 못 했으므로 오류의 원인을 파악하는 것이 어려웠습니다.
코드 재현 :
function get_arr() { return array(1,2); } $array = get_arr(); $el = array_shift($array);
-
==============================
4.
두 번째 스 니펫은 작동하지 않으며 그 이유가 있습니다. array_shift는 인수를 변경하는 수정 자 함수이므로 매개 변수가 참조가 될 것으로 기대하며 변수가 아닌 것을 참조 할 수 없습니다. Rasmus의 설명을 보려면 http://bugs.php.net/bug.php?id=48937을 참조하십시오.
-
==============================
5.
이 코드 :
$monthly_index = array_shift(unpack('H*', date('m/Y')));
편집 대상 :
$date_time = date('m/Y'); $unpack = unpack('H*', $date_time); array_shift($unpack);
-
==============================
6.
그런 명백한 경우에, 당신은 항상 함수 앞에서 "@"를 사용함으로써 메시지를 억제하도록 PHP에게 말할 수 있습니다.
$ monthly_index = @array_shift (언팩 ( 'H *', 날짜 ( 'm / Y')));
이 방법으로 모든 오류를 억제하는 최고의 프로그래밍 방법 중 하나가 아닐 수도 있지만 특정 경우 (이 경우와 같이)는 편리하고 허용됩니다.
결과적으로, 나는 당신의 친구 SysAdmin이 덜 오염 된 "error.log"에 만족할 것이라고 확신합니다. ;)
from https://stackoverflow.com/questions/2354609/strict-standards-only-variables-should-be-passed-by-reference by cc-by-sa and MIT lisence
'PHP' 카테고리의 다른 글
PDO 연결을 올바르게 설정하는 방법 (0) | 2018.09.02 |
---|---|
좋은 PHP ORM 라이브러리? (0) | 2018.09.02 |
자바 스크립트에서 PHP 함수 호출하기 (0) | 2018.09.02 |
PHP 치명적인 오류를 어떻게 잡을 수 있습니까? (0) | 2018.09.02 |
문자열에 특정 단어가 포함되어 있는지 어떻게 확인합니까? (0) | 2018.09.02 |