2010-07-07 125 views
54

具有自動變量聲明的其他語言 - 比如Perl - 具有嚴格的模式。PHP中的嚴格模式?

通過激活這種嚴格模式,變量聲明是必需的,只要您嘗試使用未聲明的變量,Perl就會拋出錯誤。

PHP提供任何類似的功能嗎?

+1

由於版本7 [PHP確實支持嚴格模式](http://php.net/manual/en/migration70.new-features.php),只是把'聲明(strict_types = 1); '在每個(和每個)腳本文件的頂部,在命名空間聲明之前。 – Code4R7 2017-05-23 09:05:57

+0

@ Code4R7這是一種不同的嚴格模式,然後在問題中詢問。 – Flimm 2017-07-03 16:59:58

+0

是的。恢復爲'error_reporting(E_STRICT);'。 – Code4R7 2017-07-04 09:03:03

回答

60

的種類。您可以激活error reporting中的E_NOTICE級別。 (常量列表here。)

每個使用未聲明變量的實例都將引發一個E_NOTICE

E_STRICT錯誤livel也會拋出這些通知,以及其他關於如何優化代碼的提示。

error_reporting(E_STRICT); 

終止腳本

如果你真的很嚴重,希望你的腳本終止而不是遇到一個未聲明的變量時,只是輸出的通知,你可以建立一個custom error handler

,在他們只處理與「未定義的變量」的告示,並傳遞到默認的PHP錯誤處理一切工作例如:

<?php 

error_reporting(E_STRICT); 

function terminate_missing_variables($errno, $errstr, $errfile, $errline) 
{        
    if (($errno == E_NOTICE) and (strstr($errstr, "Undefined variable"))) 
    die ("$errstr in $errfile line $errline"); 

    return false; // Let the PHP error handler handle all the rest 
} 

$old_error_handler = set_error_handler("terminate_missing_variables"); 

echo $test; // Will throw custom error 

xxxx(); // Will throw standard PHP error 

?> 
+0

是的,它有點像其他嚴格類型的語言,但沒有整體。 – Sarfraz 2010-07-07 08:30:32

+1

@sAc yup,還有其他東西也會作爲通知輸出,所以當你打開它時它們也會出現。 (顯然,它不像強類型語言那樣嚴格。) – 2010-07-07 08:31:42

+0

感謝您的代碼工作出色!我將'die'改爲'throw'將輸出重定向到Zend Error Trace視圖。 – jantimon 2010-07-07 13:30:28

3

是的,在腳本的開頭鍵入error_reporting(E_STRICT|E_ALL);

+0

只有在使用PHP 5.4.0之前,您需要明確指定'E_STRICT'。請參閱http://php.net/manual/en/function.error-reporting.php,其中'E_STRICT'自5.4.0起成爲'E_ALL'的一部分。 – Roland 2017-10-27 13:01:16

1

PHP 警告大約在默認情況下未聲明的變量,你只需要要打開error reporting級別,以便您可以看到通知。請注意,由於沒有特別的語法來聲明PHP中的變量,並且只需通過分配給它來聲明一個變量,它只能在您嘗試時使用未聲明的變量的值來警告您。與其他語言相反,「未聲明的變量賦值」不存在,所以PHP無法在那裏提醒你。

1

使用

error_reporting(E_ALL); 

在你的PHP代碼的開始。 或在您的php.ini文件中設置error_reporting設置,爲所有PHP文件設置它

35

使用

error_reporting(-1); 

顯示每一個可能的錯誤,包括E_STRICT甚至當新的水平和常量在未來的PHP版本中加入。

Reference

+5

+1表示事物和未來的兼容性。 – Sarfraz 2010-07-07 08:37:45

+1

這真是太神奇了,謝謝! – 2013-01-16 03:41:33

+1

error_reporting(-1)與error_reporting(E_STRICT)相同嗎? – Pacerier 2013-06-06 14:16:08

1

您可以set_error_handler()實現自己的錯誤處理功能。

然後,您可以根據需要對某些錯誤級別做出反應。

例如,如果未正確聲明變量或遇到任何不滿意的情況,您可以終止腳本,而不是僅顯示和記錄錯誤消息。

這樣,您可以對在PHP解釋器實例上運行的任何代碼執行非常嚴格的策略。

0

我建議報告和處理錯誤的要求在您的開發環境和現場生產環境(WWW,公司內聯網等)中有所不同。在開發過程中,您會希望儘可能詳細地查看和修復問題。

在現場環境中,我認爲不是想向用戶顯示PHP錯誤消息,而是允許腳本繼續使用減少的功能(例如,「很抱歉,我們無法更新您的配置文件時刻「,或將用戶重定向到主頁等)。一個方法來實現這一點將通過使用自定義錯誤處理程序爲每個環境

+0

我在測試/開發階段實現了Pekkas代碼。 – jantimon 2010-07-07 13:27:26