PHP Conference Japan 2024

預定義常數

以下常數始終作為 PHP 核心的一部分提供。

以下常數(對應的數值或其符號名稱)用作位元遮罩,以指定要報告的錯誤。 可以使用位元運算子來組合這些值或遮罩掉某些類型的錯誤。

提示

這些常數的名稱可以在 php.ini 中使用,而不使用它們對應的原始數值。但是,在 php.ini 中只理解 |~^!& 運算子。

警告

在 PHP 之外無法使用這些符號名稱。例如,在 httpd.conf 中,必須使用計算出的位元遮罩值。

E_ERROR (整數)
致命的執行階段錯誤。這些錯誤表示無法恢復的錯誤,例如記憶體配置問題。腳本的執行將會停止。 常數值:1
E_WARNING (整數)
執行階段警告(非致命錯誤)。腳本的執行不會停止。 常數值:2
E_PARSE (整數)
編譯時期的解析錯誤。解析錯誤應該只由解析器產生。 常數值:4
E_NOTICE (整數)
執行階段通知。表示腳本遇到了一些可能指示錯誤的情況,但也可能在腳本正常執行過程中發生。 常數值:8
E_CORE_ERROR (整數)
在 PHP 初始啟動期間發生的致命錯誤。這類似於 E_ERROR,不同之處在於它是由 PHP 核心產生的。 常數值:16
E_CORE_WARNING (整數)
在 PHP 初始啟動期間發生的警告(非致命錯誤)。這類似於 E_WARNING,不同之處在於它是由 PHP 核心產生的。 常數值:32
E_COMPILE_ERROR (整數)
致命的編譯時期錯誤。這類似於 E_ERROR,不同之處在於它是由 Zend Scripting Engine 產生的。 常數值:64
E_COMPILE_WARNING (整數)
編譯時期的警告(非致命錯誤)。這類似於 E_WARNING,不同之處在於它是由 Zend Scripting Engine 產生的。 常數值:128
E_DEPRECATED (整數)
執行階段棄用通知。啟用此選項可接收關於未來版本將無法運作的程式碼的警告。 常數值:8192
E_USER_ERROR (整數)
使用者產生的錯誤訊息。這類似於 E_ERROR,不同之處在於它是透過 PHP 函式 trigger_error() 在 PHP 程式碼中產生的。 常數值:256
警告

自 PHP 8.4.0 起,不建議將此常數與 trigger_error() 一起使用。建議改用 throw 拋出 Exception 例外或呼叫 exit() 函式。

E_USER_WARNING (整數)
使用者產生的警告訊息。這類似於 E_WARNING,不同之處在於它是透過 PHP 函式 trigger_error() 在 PHP 程式碼中產生的。 常數值:512
E_USER_NOTICE (整數)
使用者產生的通知訊息。這類似於 E_NOTICE,不同之處在於它是透過 PHP 函式 trigger_error() 在 PHP 程式碼中產生的。 常數值:1024
E_USER_DEPRECATED (整數)
使用者產生的棄用訊息。這類似於 E_DEPRECATED,不同之處在於它是透過 PHP 函式 trigger_error() 在 PHP 程式碼中產生的。 常數值:16384
E_STRICT (整數)
PHP 針對已執行的程式碼發出的執行階段建議,以確保向前相容性。 常數值:2048
警告

此錯誤級別未使用,並且已在 PHP 8.4.0 中棄用。

E_RECOVERABLE_ERROR (整數)
舊版引擎的「例外」,對應於可捕捉的致命錯誤。類似於 Error,但必須透過使用者定義的錯誤處理程式捕捉(請參閱 set_error_handler())。如果未處理,其行為類似於 E_ERROR 常數值:4096

注意此錯誤級別實際上未使用,唯一可能發生的情況是將 物件 解釋為 布林值 失敗時。這只會發生在內部物件上。 在 PHP 8.4.0 之前,最常見的例子是在條件式中使用 GMP 實例。

E_ALL (整數)
包含每個錯誤、警告和通知的位元遮罩。 常數值:32767
新增註釋

使用者貢獻的註釋 8 則註釋

Andy at Azurite (co uk)
13 年前
-1 作為位元欄位在語義上也毫無意義,並且僅適用於二補數數值表示法。在一補數系統上,-1 不會設定 E_ERROR。在符號大小系統上,-1 根本不會設定任何東西!(例如,參見 http://en.wikipedia.org/wiki/Ones%27_complement

如果您想設定所有位元,~0 是正確的方法。

但設定未定義的位元可能會導致未定義的行為,這表示*任何事情*都可能發生 :-)
russthom at fivegulf dot com
12 年前
[編者註:修正了錯誤返回 E_CORE_* 字串的 E_COMPILE_* 案例。感謝 josiebgoode。]

以下程式碼擴展了 Vlad 的程式碼,以顯示所有已設定的旗標。如果未設定,則顯示空白行。

<?php
$errLvl
= error_reporting();
for (
$i = 0; $i < 15; $i++ ) {
print
FriendlyErrorType($errLvl & pow(2, $i)) . "<br>\\n";
}

function
FriendlyErrorType($type)
{
switch(
$type)
{
case
E_ERROR: // 1 //
return 'E_ERROR';
case
E_WARNING: // 2 //
return 'E_WARNING';
case
E_PARSE: // 4 //
return 'E_PARSE';
case
E_NOTICE: // 8 //
return 'E_NOTICE';
case
E_CORE_ERROR: // 16 //
return 'E_CORE_ERROR';
case
E_CORE_WARNING: // 32 //
return 'E_CORE_WARNING';
case
E_COMPILE_ERROR: // 64 //
return 'E_COMPILE_ERROR';
case
E_COMPILE_WARNING: // 128 //
return 'E_COMPILE_WARNING';
case
E_USER_ERROR: // 256 //
return 'E_USER_ERROR';
case
E_USER_WARNING: // 512 //
return 'E_USER_WARNING';
case
E_USER_NOTICE: // 1024 //
return 'E_USER_NOTICE';
case
E_STRICT: // 2048 //
return 'E_STRICT';
case
E_RECOVERABLE_ERROR: // 4096 //
return 'E_RECOVERABLE_ERROR';
case
E_DEPRECATED: // 8192 //
return 'E_DEPRECATED';
case
E_USER_DEPRECATED: // 16384 //
return 'E_USER_DEPRECATED';
}
return
"";
}
?>
fadhilinjagi at gmail dot com
3 年前
一個簡單俐落的方法,可以從錯誤代碼中取得錯誤級別。您甚至可以進一步自訂錯誤級別名稱。

<?php
$exceptions
= [
E_ERROR => "E_ERROR",
E_WARNING => "E_WARNING",
E_PARSE => "E_PARSE",
E_NOTICE => "E_NOTICE",
E_CORE_ERROR => "E_CORE_ERROR",
E_CORE_WARNING => "E_CORE_WARNING",
E_COMPILE_ERROR => "E_COMPILE_ERROR",
E_COMPILE_WARNING => "E_COMPILE_WARNING",
E_USER_ERROR => "E_USER_ERROR",
E_USER_WARNING => "E_USER_WARNING",
E_USER_NOTICE => "E_USER_NOTICE",
E_STRICT => "E_STRICT",
E_RECOVERABLE_ERROR => "E_RECOVERABLE_ERROR",
E_DEPRECATED => "E_DEPRECATED",
E_USER_DEPRECATED => "E_USER_DEPRECATED",
E_ALL => "E_ALL"
];

echo
$exceptions["1"];
$code = 256;
echo
$exceptions[$code];
?>

輸出
E_ERROR
E_USER_ERROR

當 PHP 更新錯誤級別名稱時,這需要更新。否則,它就能正常工作。
bbrokman at gmail dot com
5 年前
在程式碼中控制錯誤報告設定的一個簡潔方法 :)

<?php

$errorsActive
= [
E_ERROR => FALSE,
E_WARNING => TRUE,
E_PARSE => TRUE,
E_NOTICE => TRUE,
E_CORE_ERROR => FALSE,
E_CORE_WARNING => FALSE,
E_COMPILE_ERROR => FALSE,
E_COMPILE_WARNING => FALSE,
E_USER_ERROR => TRUE,
E_USER_WARNING => TRUE,
E_USER_NOTICE => TRUE,
E_STRICT => FALSE,
E_RECOVERABLE_ERROR => TRUE,
E_DEPRECATED => FALSE,
E_USER_DEPRECATED => TRUE,
E_ALL => FALSE,
];

error_reporting(
array_sum(
array_keys($errorsActive, true)
)
);

?>
cl at viazenetti dot de
7 年前
另一種取得所有已設定要回報的 PHP 錯誤的方法。即使將來新增了其他錯誤類型,這段程式碼也能正常運作。

<?php
$pot
= 0;
foreach (
array_reverse(str_split(decbin(error_reporting()))) as $bit) {
if (
$bit == 1) {
echo
array_search(pow(2, $pot), get_defined_constants(true)['Core']). "<br>\n";
}
$pot++;
}
?>
kezzyhko at NOSPAM dot semysha dot ru
8 年前
對我來說,用整數值取得錯誤名稱的最佳方法是這個。而且它對我來說很有效 ;)
<?php

array_flip
(array_slice(get_defined_constants(true)['Core'], 1, 15, true))[$type];

// 更易讀的寫法
array_flip(
array_slice(
get_defined_constants(true)['Core'],
1,
15,
true
)
)[
$type]

?>
kaioker
3 年前
將簡潔的錯誤碼轉換為人類可讀的格式

function prettycode($code){
return $code == 0 ? "FATAL" : array_search($code, get_defined_constants(true)['Core']);
}
ErikBachmann
5 年前
<?php
function getErrorTypeByValue($type) {
$constants = get_defined_constants(true);

foreach (
$constants['Core'] as $key => $value ) { // 每個核心常數
if ( preg_match('/^E_/', $key ) ) { // 檢查錯誤常數
if ( $type == $value )
return(
"$key=$value");
}
}
}
// getErrorTypeByValue()

echo "[".getErrorTypeByValue( 1 ) . "]". PHP_EOL;
echo
"[".getErrorTypeByValue( 0 ) . "]". PHP_EOL;
echo
"[".getErrorTypeByValue( 8 ) . "]". PHP_EOL;
?>

將會輸出
[E_ERROR=1]
[]
[E_NOTICE=8]
To Top