오류 메시지 "Strict standards:변수만 참조로 전달해야 합니다."
$el = array_shift($instance->find(..))
위의 코드는 엄격한 표준 경고를 보고하지만, 다음과 같은 경우는 보고되지 않습니다.
function get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
그럼 경고는 언제 보고될까요?
다음 코드를 고려합니다.
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()method는 변수가 아니며 strict 모드에서는 경고가 생성됩니다.이 동작은 매우 직관적이지 않습니다.get_arr()method는 배열 값을 반환합니다.
엄밀한 모드에서 이 오류를 회피하려면 참조를 사용하지 않도록 메서드의 시그니처를 변경합니다.
function test_arr($a) {
var_dump($a);
}
의 서명을 변경할 수 없기 때문에array_shift중간 변수를 사용할 수도 있습니다.
$inter = get_arr();
$el = array_shift($inter);
$instance->find()변수에 대한 참조를 반환합니다.
이 참조를 변수에 저장하지 않고 함수에 대한 인수로 사용하려고 하면 보고서가 나타납니다.
이는 메모리 누수를 방지하는 데 도움이 되며 다음 PHP 버전에서는 오류가 될 수 있습니다.
두 번째 코드 블록이 다음과 같이 기록되면 오류가 발생합니다(참고:&기능 시그니처) :
function &get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
즉, 간단한 수정은 다음과 같습니다.
$el = array_shift($tmp = $instance->find(..));
기본적으로는 먼저 임시 변수에 할당하고 변수를 인수로 전송합니다.
이 오류의 원인은 내부 PHP 프로그래밍 데이터 구조 함수인 array_shift() [php.net/end]의 사용 때문입니다.
함수는 배열을 매개 변수로 사용합니다.앰퍼샌드는 시제품에 표시되지만array_shift()매뉴얼"에는 해당 기능의 확장 정의에 따른 주의 문서도 없으며 매개변수가 실제로 참조에 의해 전달되었다는 명백한 설명도 없습니다.
아마 이것은 /이해되었을 것이다.다만, 저는 이해할 수 없었기 때문에, 에러의 원인을 발견하기 어려웠습니다.
코드 재생:
function get_arr()
{
return array(1, 2);
}
$array = get_arr();
$el = array_shift($array);
다음 코드:
$monthly_index = array_shift(unpack('H*', date('m/Y')));
다음과 같이 변경해야 합니다.
$date_time = date('m/Y');
$unpack = unpack('H*', $date_time);
array_shift($unpack);
두 번째 조각도 작동하지 않습니다. 그래서 그렇습니다.
array_shift는 인수를 변경하는 수식자 함수입니다.따라서 매개 변수가 참조가 될 것으로 예상하므로 변수가 아닌 다른 매개 변수를 참조할 수 없습니다.Rasmus 설명 참조: 엄격한 기준: 변수만 참조로 전달해야 합니다.
음, 이와 같은 명백한 경우, 함수 앞에 "@"를 사용하면 언제든지 PHP에 메시지를 표시하지 않도록 지시할 수 있습니다.
$monthly_index = @array_shift(unpack('H*', date('m/Y')));
이러한 방법으로 모든 오류를 억제하는 것이 최선의 프로그래밍 방법 중 하나는 아닐 수 있지만, (이러한) 경우에 따라서는 편리하고 허용할 수 있습니다.
그 당신의 관리자이 덜 된 '시스템 관리자'가입니다.error.log.
언급URL : https://stackoverflow.com/questions/2354609/error-message-strict-standards-only-variables-should-be-passed-by-reference
'programing' 카테고리의 다른 글
| 텍스트 입력 필드에서 Enter 키를 검출합니다. (0) | 2022.11.14 |
|---|---|
| PHP var_dump()와 같이 Smarty에서 변수를 디버깅하는 방법 (0) | 2022.11.14 |
| yii2에는 고정 연결 옵션이 있습니까? (0) | 2022.11.14 |
| 라라벨이 연애를 주문하다 (0) | 2022.11.14 |
| SQL 파일을 DBeaver로 가져오기 (0) | 2022.11.14 |