2009-11-25 4 views
5

저는 PHP dev 설치시 오류 억제 연산자를 사용하고 있습니다.Error Suppression @ Not Working

Notice: Uninitialized string offset: 0 in C:\websites\xxx\htdocs\includes\myscript.php on line 35

행 35 : 그러나 최근과 같이주의 사항 명중 입수했습니다

$file_name = @$File['file_name'];

I가 display_errors를이, 그리고 6143 (E_ALL)로 설정 error_reporting은.

나는 뭔가를 놓친가요? 오류를 표시하지 않아야합니까?

편집 : 처녀 스크립트에서 테스트

는 :

 
$a = array(); 
$b = @$a['f5']; 

오류를 억제. 그래서 우리는 error_reporting 값을 어떻게 든 변경하고 있다고 생각합니다. (11시 영화)

예멘 아랍 공화국 도움.

+1

35 번 라인을 게시 할 수 있습니까? –

+0

잘못된 진술을 억압하는 것과 같습니다. 코드 –

+0

을 입력하십시오. 모든 코드를 표시하십시오. 모든 행에 입력 할 수 있습니다. – Cesar

답변

5

오류를 잡을 좋은 방법이없는 던지기 스크립트 나 인스턴스를 제외하고는 여기에 오류를 억제 할 수있는 큰 팬이 아닙니다.

Uninitialized string offset 오류의 동작을 설명하겠습니다.1

$a = 0; 
$b = $a['f5']; 

$a는 숫자 스칼라 값입니다

예 번호 : 그것은 버그가 아닙니다. 두 번째 줄에서 PHP는이 숫자 값을 문자열로 암시 적으로 변환합니다. '0'의 길이는 1입니다.

PHP에서는 배열 인덱스를 사용하여 문자열의 문자를 조회 할 수 있습니다. PHP는 문자열을 내부적으로 배열로 저장합니다. 예를 들어 : 그것은 문자열 번째 문자이기 때문에

$s= 'abcd'; 
print_r($s[1]); 

이 코드의 출력 b 될 것이다. 예 # 1에서 문자열은 문자 위치에 의해서만 인덱싱 될 수 있으므로 조회 'f5'은 숫자로 변환됩니다. echo intval('f5');'f5' 문자열을 숫자 문맥으로 0으로 해석하는 PHP를 보여줍니다.

지금까지 나와 함께? 우리는 예 # 2

예제 #이를 적용 할 때 여기에 2

$a = ''; 
$b = $a['f5']; 

$a는 길이가 0 인 문자열입니다 무슨이다. 두 번째 줄은 $b= $a[0];과 동일합니다. 즉, 두 번째 줄은 길이가 0 인 문자열의 첫 번째 문자를 요청하지만 문자열에는 문자가 없습니다. 그래서 PHP를 사용하면 인덱스가 단순히 존재하지 않는 알려주는, 다음과 같은 오류가 발생합니다 :

Notice: Uninitialized string offset: 0 in C:\websites\tcv3\wc2009\htdocs\aatest_array.php on line 3 

이러한 느슨한 타입 언어로 프로그램의 하드 노크입니다.

+0

명확하고 간결한 설명을 위해 Thx, pygorex1. – NotoriousWebmaster

-3

아니요, @ 억제 기는 변수 액세스 및 선언이 아닌 함수 호출로부터 경고를 표시하지 않습니다. Notice은 정의되지 않았으며 초기화되지 않은 문자열 요소 [0]에 액세스하고 있음을 알려줍니다. 이것을 억제하려면, 초기화되지 않은 변수를 모두 확인한 다음 C에 따라 값을 지정하십시오.

+2

설명서에 동의하지 않습니다. Derek : http://ca.php.net/manual/en/language.operators.errorcontrol.php – NotoriousWebmaster

1

오류는 문자열 오프셋이 0이므로 행에 적용하면 안됩니다 제공되는 코드 정수 오프셋이 없습니다. 거기에 'file_name'문자열을 사용하고 있습니다.

또한 @을 사용하는 것은 정말 끔찍한 생각입니다. 함수가 실패 할 수 있으므로 스크립트가 어디서 또는 왜 발생했는지 전혀 표시하지 않고 종료 할 수 있습니다. 당신이 붙여 넣은 코드 줄을 처리하는 더 좋은 방법이 있습니다 :

if (isset($File['file_name'])) { 
    $file_name = $File['file_name']; 
} else { 
    // throw exception, return FALSE, print an error and exit, whatever 
} 
+0

일반적으로 ($ isset ($ File [ ' file_name '])? $ File ['file_name '] :' '). 하지만 인덱스 문제에 관해서는 동의하지 않으면 안됩니다. 사용중인 PHP 버전의 버그 인 것 같습니다 (5.2.2). 나는 대답을 참조하십시오. – NotoriousWebmaster

+0

엽기. 헤즈 업에 감사드립니다. –

0

OK, 여기에 일이 : PHP는 배열이 아닌이 바르에 첨자 잘 처리하지 않습니다. 예 :

 
$a = 0; 
$b = $a['f5']; 

오류를 생성하지 않습니다.

 
$a = ''; 
$b = $a['f5']; 

이 오류가 생성 :

 
Notice: Uninitialized string offset: 0 in C:\websites\tcv3\wc2009\htdocs\aatest_array.php on line 3 

을 그리고 내가 가지고 있던 문제입니다 반면

. array()를 사용하여 $ a를 초기화하는 것으로 전환하면 오류 억제가 작동합니다. 또한 오류를 억제하지 않으면 오류에 적절한 색인을 제공합니다.

이것이 PHP 5.2.2의 버그라고 생각됩니다. 다른 사람이 더 최신 버전에서 이것을 테스트 할 수 있습니까?

당신의 도움을 위해 Thx.

+0

"PHP의 버그"라고 할 때 ... 오류를 생성하지 않는 첫 번째 코드 비트를 말하는 것입니다. 맞습니까? 다른 코드에서 얻은 오류는 완벽하게 유효합니다. – DisgruntledGoat