2009-11-25 74 views
5

我一直都很樂意在我的PHP開發環境中使用錯誤抑制操作符。但最近已經得到擊中像這樣聲明:錯誤抑制@無法正常工作

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

線35:

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

我有display_errors設置,並使用error_reporting設置爲6143(E_ALL)。

我錯過了什麼嗎?錯誤不應該被壓制?

編輯:

在處女腳本測試:

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

抑制誤差。所以我認爲我們以某種方式改變了error_reporting的值。 (電影在11)

Thx for yr help。

+1

你能張貼第35行嗎? – 2009-11-25 19:34:55

+0

這就像你壓制錯誤的陳述。請提供代碼 – 2009-11-25 19:41:40

+0

顯示所有代碼,可以在任意行。 – Cesar 2009-11-25 19:55:08

回答

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');向我們展示了PHP在數字上下文中將'f5'字符串解釋爲0

到目前爲止我還在嗎?這裏是發生了什麼,當我們申請這個示例#2

例2

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

$a是零長度字符串。第二行與$b= $a[0];相同 - 即第二行詢問零長度字符串的第一個字符,但該字符串不包含字符。所以PHP引發以下錯誤,讓你知道該指數根本不存在:

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

這些都是規劃在一個鬆散類型的語言艱苦的磨練。

+0

Thx爲清晰和簡潔的解釋,pygorex1。 – NotoriousWebmaster 2009-11-27 20:34:18

-3

不,@抑制器避免顯示來自函數調用的警告,而不是顯示變量訪問和聲明的警告。 Notice告訴您,您正在訪問未定義的字符串元素[0],因此未初始化。如果您想要抑制這些變量,請嘗試檢查所有未初始化的變量,並根據您的要求給它們一個值。

+2

本手冊不同意你的看法,Derek: http://ca.php.net/manual/en/language.operators.errorcontrol.php – NotoriousWebmaster 2009-11-25 19:51:55

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 2009-11-25 21:15:12

+0

奇怪。感謝您的提醒。 – 2009-11-25 21:57:07

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中的一個bug」時......你談論的第一個代碼不會產生錯誤,對吧?從其他代碼中得到的錯誤是完全有效的。 – DisgruntledGoat 2009-11-25 21:24:02