0 關注者

類別 yii\console\ErrorHandler

繼承關係yii\console\ErrorHandler » yii\base\ErrorHandler » yii\base\Component » yii\base\BaseObject
實作yii\base\Configurable
自版本起可用2.0
原始碼 https://github.com/yiisoft/yii2/blob/master/framework/console/ErrorHandler.php

ErrorHandler 處理未捕獲的 PHP 錯誤與例外。

ErrorHandler 預設在 yii\base\Application 中配置為應用程式元件。您可以透過 Yii::$app->errorHandler 存取該實例。

公共屬性

隱藏繼承的屬性

屬性 類型 描述 定義於
$behaviors yii\base\Behavior[] 附加到此元件的行為列表。 yii\base\Component
$discardExistingOutput boolean 在顯示錯誤之前是否捨棄任何現有的頁面輸出。 yii\base\ErrorHandler
$exception Throwable|null 目前正在處理的例外。 yii\base\ErrorHandler
$memoryReserveSize integer 保留記憶體的大小。 yii\base\ErrorHandler
$silentExitOnException boolean 若為 true - handleException() 將以 ExitCode::OK 結束腳本。 yii\base\ErrorHandler

公共方法

隱藏繼承的方法

方法 描述 定義於
__call() 調用非類別方法的具名方法。 yii\base\Component
__clone() 在通過克隆現有對象創建對象後調用此方法。 yii\base\Component
__construct() 建構子。 yii\base\BaseObject
__get() 返回元件屬性的值。 yii\base\Component
__isset() 檢查屬性是否已設定,即已定義且非 null。 yii\base\Component
__set() 設定元件屬性的值。 yii\base\Component
__unset() 將元件屬性設定為 null。 yii\base\Component
attachBehavior() 將行為附加到此元件。 yii\base\Component
attachBehaviors() 將行為列表附加到元件。 yii\base\Component
behaviors() 返回此元件應表現為的行為列表。 yii\base\Component
canGetProperty() 返回指示屬性是否可讀取的值。 yii\base\Component
canSetProperty() 返回指示屬性是否可設定的值。 yii\base\Component
className() 返回此類別的完整限定名稱。 yii\base\BaseObject
clearOutput() 移除在調用此方法之前輸出的所有內容。 yii\base\ErrorHandler
convertExceptionToError() 將例外轉換為 PHP 錯誤。 yii\base\ErrorHandler
convertExceptionToString() 將例外轉換為簡單字串。 yii\base\ErrorHandler
convertExceptionToVerboseString() 將例外轉換為包含關於例外及其追蹤的詳細資訊的字串。 yii\base\ErrorHandler
detachBehavior() 從元件分離行為。 yii\base\Component
detachBehaviors() 從元件分離所有行為。 yii\base\Component
ensureBehaviors() 確保在 behaviors() 中宣告的行為已附加到此元件。 yii\base\Component
getBehavior() 返回具名的行為對象。 yii\base\Component
getBehaviors() 返回附加到此元件的所有行為。 yii\base\Component
handleError() 處理 PHP 執行錯誤,例如警告和通知。 yii\base\ErrorHandler
handleException() 處理未捕獲的 PHP 例外。 yii\base\ErrorHandler
handleFatalError() 處理致命的 PHP 錯誤。 yii\base\ErrorHandler
handleHhvmError() 處理 HHVM 執行錯誤,例如警告和通知。 yii\base\ErrorHandler
hasEventHandlers() 返回指示是否有名稱事件附加任何處理程序的值。 yii\base\Component
hasMethod() 返回指示是否定義了方法的值。 yii\base\Component
hasProperty() 返回指示是否為此元件定義了屬性的值。 yii\base\Component
init() yii\base\ErrorHandler
logException() 記錄給定的例外。 yii\base\ErrorHandler
off() 從此元件分離現有的事件處理程序。 yii\base\Component
on() 將事件處理程序附加到事件。 yii\base\Component
register() 註冊此錯誤處理程序。 yii\base\ErrorHandler
trigger() 觸發事件。 yii\base\Component
unregister() 通過恢復 PHP 錯誤和例外處理程序來取消註冊此錯誤處理程序。 yii\base\ErrorHandler

受保護方法

隱藏繼承的方法

方法 描述 定義於
formatMessage() 為控制台輸出著色訊息。 yii\console\ErrorHandler
handleFallbackExceptionMessage() 處理在 handleException() 中例外處理期間拋出的例外。 yii\base\ErrorHandler
renderException() 使用 ansi 格式呈現控制台輸出的例外。 yii\console\ErrorHandler

事件

隱藏繼承的事件

事件 類型 描述 定義於
EVENT_SHUTDOWN yii\base\Event 通過關閉函數經由 handleFatalError() 調用處理程序時觸發的事件。(自 2.0.46 版本起可用) yii\base\ErrorHandler

方法詳情

隱藏繼承的方法

__call() public method

定義於: yii\base\Component::__call()

調用非類別方法的具名方法。

此方法將檢查是否有任何附加的行為具有指定名稱的方法,若有的話則會執行它。

請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當調用未知方法時會被隱式呼叫。

public mixed __call ( $name, $params )
$name string

方法名稱

$params array

方法參數

return mixed

方法回傳值

throws yii\base\UnknownMethodException

當呼叫未知方法時

                public function __call($name, $params)
{
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $object) {
        if ($object->hasMethod($name)) {
            return call_user_func_array([$object, $name], $params);
        }
    }
    throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}

            
__clone() public method

定義於: yii\base\Component::__clone()

在通過克隆現有對象創建對象後調用此方法。

它會移除所有行為,因為這些行為都附加到舊的物件上。

public void __clone ( )

                public function __clone()
{
    $this->_events = [];
    $this->_eventWildcards = [];
    $this->_behaviors = null;
}

            
__construct() public method

定義於: yii\base\BaseObject::__construct()

建構子。

預設實作會做兩件事:

  • 使用給定的配置 $config 初始化物件。
  • 呼叫 init()

如果子類別覆寫了此方法,建議:

  • 建構子的最後一個參數是配置陣列,如同此處的 $config
  • 在建構子的結尾呼叫父類別的實作。
public void __construct ( $config = [] )
$config array

將用於初始化物件屬性的 鍵值對 (Name-value pairs)

                public function __construct($config = [])
{
    if (!empty($config)) {
        Yii::configure($this, $config);
    }
    $this->init();
}

            
__get() public method

定義於: yii\base\Component::__get()

返回元件屬性的值。

此方法將依以下順序檢查並採取相應行動:

  • 由 getter 定義的屬性:回傳 getter 結果
  • 行為的屬性:回傳行為屬性值

請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當執行 $value = $component->property; 時會被隱式呼叫。

另請參閱 __set()

public mixed __get ( $name )
$name string

屬性名稱

return mixed

屬性值或行為屬性的值

throws yii\base\UnknownPropertyException

如果屬性未定義

throws yii\base\InvalidCallException

如果屬性為唯寫。

                public function __get($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        // read property, e.g. getName()
        return $this->$getter();
    }
    // behavior property
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $behavior) {
        if ($behavior->canGetProperty($name)) {
            return $behavior->$name;
        }
    }
    if (method_exists($this, 'set' . $name)) {
        throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
    }
    throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}

            
__isset() public method

定義於: yii\base\Component::__isset()

檢查屬性是否已設定,即已定義且非 null。

此方法將依以下順序檢查並採取相應行動:

  • 由 setter 定義的屬性:回傳屬性是否已設定
  • 行為的屬性:回傳屬性是否已設定
  • 對於不存在的屬性回傳 false

請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當執行 isset($component->property) 時會被隱式呼叫。

另請參閱 https://php.dev.org.tw/manual/en/function.isset.php

public boolean __isset ( $name )
$name string

屬性名稱或事件名稱

return boolean

指定的屬性是否已設定

                public function __isset($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        return $this->$getter() !== null;
    }
    // behavior property
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $behavior) {
        if ($behavior->canGetProperty($name)) {
            return $behavior->$name !== null;
        }
    }
    return false;
}

            
__set() public method

定義於: yii\base\Component::__set()

設定元件屬性的值。

此方法將依以下順序檢查並採取相應行動:

  • 由 setter 定義的屬性:設定屬性值
  • 格式為 "on xyz" 的事件:將處理器附加到 "xyz" 事件
  • 格式為 "as xyz" 的行為:附加名為 "xyz" 的行為
  • 行為的屬性:設定行為屬性值

請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當執行 $component->property = $value; 時會被隱式呼叫。

另請參閱 __get()

public void __set ( $name, $value )
$name string

屬性名稱或事件名稱

$value mixed

屬性值

throws yii\base\UnknownPropertyException

如果屬性未定義

throws yii\base\InvalidCallException

如果屬性為唯讀。

                public function __set($name, $value)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
        // set property
        $this->$setter($value);
        return;
    } elseif (strncmp($name, 'on ', 3) === 0) {
        // on event: attach event handler
        $this->on(trim(substr($name, 3)), $value);
        return;
    } elseif (strncmp($name, 'as ', 3) === 0) {
        // as behavior: attach behavior
        $name = trim(substr($name, 3));
        $this->attachBehavior($name, $value instanceof Behavior ? $value : Yii::createObject($value));
        return;
    }
    // behavior property
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $behavior) {
        if ($behavior->canSetProperty($name)) {
            $behavior->$name = $value;
            return;
        }
    }
    if (method_exists($this, 'get' . $name)) {
        throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
    }
    throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}

            
__unset() public method

定義於: yii\base\Component::__unset()

將元件屬性設定為 null。

此方法將依以下順序檢查並採取相應行動:

  • 由 setter 定義的屬性:將屬性值設定為 null
  • 行為的屬性:將屬性值設定為 null

請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當執行 unset($component->property) 時會被隱式呼叫。

另請參閱 https://php.dev.org.tw/manual/en/function.unset.php

public void __unset ( $name )
$name string

屬性名稱

throws yii\base\InvalidCallException

如果屬性為唯讀。

                public function __unset($name)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
        $this->$setter(null);
        return;
    }
    // behavior property
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $behavior) {
        if ($behavior->canSetProperty($name)) {
            $behavior->$name = null;
            return;
        }
    }
    throw new InvalidCallException('Unsetting an unknown or read-only property: ' . get_class($this) . '::' . $name);
}

            
attachBehavior() public method

定義於: yii\base\Component::attachBehavior()

將行為附加到此元件。

此方法將根據給定的配置建立行為物件。 之後,將透過呼叫 yii\base\Behavior::attach() 方法將行為物件附加到此元件。

另請參閱 detachBehavior()

public yii\base\Behavior attachBehavior ( $name, $behavior )
$name string

行為的名稱。

$behavior string|array|yii\base\Behavior

行為配置。 這可以是下列其中一項:

return yii\base\Behavior

行為物件

                public function attachBehavior($name, $behavior)
{
    $this->ensureBehaviors();
    return $this->attachBehaviorInternal($name, $behavior);
}

            
attachBehaviors() public method

定義於: yii\base\Component::attachBehaviors()

將行為列表附加到元件。

每個行為都以其名稱索引,並且應該是 yii\base\Behavior 物件、指定行為類別的字串,或是用於建立行為的配置陣列。

另請參閱 attachBehavior()

public void attachBehaviors ( $behaviors )
$behaviors array

要附加到元件的行為列表

                public function attachBehaviors($behaviors)
{
    $this->ensureBehaviors();
    foreach ($behaviors as $name => $behavior) {
        $this->attachBehaviorInternal($name, $behavior);
    }
}

            
behaviors() public method

定義於: yii\base\Component::behaviors()

返回此元件應表現為的行為列表。

子類別可以覆寫此方法以指定它們想要表現的行為。

此方法的回傳值應為行為物件或配置的陣列,並以行為名稱作為索引。 行為配置可以是指定行為類別的字串,或具有以下結構的陣列:

'behaviorName' => [
    'class' => 'BehaviorClass',
    'property1' => 'value1',
    'property2' => 'value2',
]

請注意,行為類別必須繼承自 yii\base\Behavior。 行為可以使用名稱或匿名方式附加。 當使用名稱作為陣列鍵時,使用此名稱,稍後可以使用 getBehavior() 檢索行為,或使用 detachBehavior() 分離行為。 匿名行為無法檢索或分離。

在此方法中宣告的行為將會自動 (依需求) 附加到元件。

public array behaviors ( )
return array

行為配置。

                public function behaviors()
{
    return [];
}

            
canGetProperty() public method

定義於: yii\base\Component::canGetProperty()

返回指示屬性是否可讀取的值。

如果符合以下條件,則可以讀取屬性:

  • 類別具有與指定名稱相關聯的 getter 方法(在這種情況下,屬性名稱不區分大小寫);
  • 類別具有具有指定名稱的成員變數 (當 $checkVars 為 true 時);
  • 附加的行為具有給定名稱的可讀屬性 (當 $checkBehaviors 為 true 時)。

另請參閱 canSetProperty()

public boolean canGetProperty ( $name, $checkVars true, $checkBehaviors true )
$name string

屬性名稱

$checkVars boolean

是否將成員變數視為屬性

$checkBehaviors boolean

是否將行為的屬性視為此元件的屬性

return boolean

屬性是否可讀

                public function canGetProperty($name, $checkVars = true, $checkBehaviors = true)
{
    if (method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name)) {
        return true;
    } elseif ($checkBehaviors) {
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $behavior) {
            if ($behavior->canGetProperty($name, $checkVars)) {
                return true;
            }
        }
    }
    return false;
}

            
canSetProperty() public method

定義於: yii\base\Component::canSetProperty()

返回指示屬性是否可設定的值。

如果符合以下條件,則可以寫入屬性:

  • 類別具有與指定名稱相關聯的 setter 方法(在這種情況下,屬性名稱不區分大小寫);
  • 類別具有具有指定名稱的成員變數 (當 $checkVars 為 true 時);
  • 附加的行為具有給定名稱的可寫入屬性 (當 $checkBehaviors 為 true 時)。

另請參閱 canGetProperty()

public boolean canSetProperty ( $name, $checkVars true, $checkBehaviors true )
$name string

屬性名稱

$checkVars boolean

是否將成員變數視為屬性

$checkBehaviors boolean

是否將行為的屬性視為此元件的屬性

return boolean

屬性是否可寫入

                public function canSetProperty($name, $checkVars = true, $checkBehaviors = true)
{
    if (method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name)) {
        return true;
    } elseif ($checkBehaviors) {
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $behavior) {
            if ($behavior->canSetProperty($name, $checkVars)) {
                return true;
            }
        }
    }
    return false;
}

            
className() public static method
自 2.0.14 版本起已棄用。 在 PHP >=5.5 上,請改用 ::class

定義於: yii\base\BaseObject::className()

返回此類別的完整限定名稱。

public static string className ( )
return string

此類別的完整限定名稱。

                public static function className()
{
    return get_called_class();
}

            
clearOutput() public method

定義於: yii\base\ErrorHandler::clearOutput()

移除在調用此方法之前輸出的所有內容。

public void clearOutput ( )

                public function clearOutput()
{
    // the following manual level counting is to deal with zlib.output_compression set to On
    for ($level = ob_get_level(); $level > 0; --$level) {
        if (!@ob_end_clean()) {
            ob_clean();
        }
    }
}

            
convertExceptionToError() public static method

定義於: yii\base\ErrorHandler::convertExceptionToError()

將例外轉換為 PHP 錯誤。

此方法可用於將方法 (例如 __toString()) 內部的例外轉換為 PHP 錯誤,因為例外無法在這些方法內部拋出。

public static never convertExceptionToError ( $exception )
$exception Throwable

要轉換為 PHP 錯誤的例外。

                public static function convertExceptionToError($exception)
{
    trigger_error(static::convertExceptionToString($exception), E_USER_ERROR);
}

            
convertExceptionToString() public static method

定義於: yii\base\ErrorHandler::convertExceptionToString()

將例外轉換為簡單字串。

public static string convertExceptionToString ( $exception )
$exception Throwable

正在轉換的例外

return string

例外的字串表示形式。

                public static function convertExceptionToString($exception)
{
    if ($exception instanceof UserException) {
        return "{$exception->getName()}: {$exception->getMessage()}";
    }
    if (YII_DEBUG) {
        return static::convertExceptionToVerboseString($exception);
    }
    return 'An internal server error occurred.';
}

            
convertExceptionToVerboseString() public static method (自 2.0.14 版本起可用)

定義於: yii\base\ErrorHandler::convertExceptionToVerboseString()

將例外轉換為包含關於例外及其追蹤的詳細資訊的字串。

public static string convertExceptionToVerboseString ( $exception )
$exception Throwable

正在轉換的例外

return string

例外的字串表示形式。

                public static function convertExceptionToVerboseString($exception)
{
    if ($exception instanceof Exception) {
        $message = "Exception ({$exception->getName()})";
    } elseif ($exception instanceof ErrorException) {
        $message = (string)$exception->getName();
    } else {
        $message = 'Exception';
    }
    $message .= " '" . get_class($exception) . "' with message '{$exception->getMessage()}' \n\nin "
        . $exception->getFile() . ':' . $exception->getLine() . "\n\n"
        . "Stack trace:\n" . $exception->getTraceAsString();
    return $message;
}

            
detachBehavior() public method

定義於: yii\base\Component::detachBehavior()

從元件分離行為。

將會調用行為的 yii\base\Behavior::detach() 方法。

public yii\base\Behavior|null detachBehavior ( $name )
$name string

行為的名稱。

return yii\base\Behavior|null

已分離的行為。 如果行為不存在,則為 Null。

                public function detachBehavior($name)
{
    $this->ensureBehaviors();
    if (isset($this->_behaviors[$name])) {
        $behavior = $this->_behaviors[$name];
        unset($this->_behaviors[$name]);
        $behavior->detach();
        return $behavior;
    }
    return null;
}

            
detachBehaviors() public method

定義於: yii\base\Component::detachBehaviors()

從元件分離所有行為。

public void detachBehaviors ( )

                public function detachBehaviors()
{
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $name => $behavior) {
        $this->detachBehavior($name);
    }
}

            
ensureBehaviors() public method

定義於: yii\base\Component::ensureBehaviors()

確保在 behaviors() 中宣告的行為已附加到此元件。

public void ensureBehaviors ( )

                public function ensureBehaviors()
{
    if ($this->_behaviors === null) {
        $this->_behaviors = [];
        foreach ($this->behaviors() as $name => $behavior) {
            $this->attachBehaviorInternal($name, $behavior);
        }
    }
}

            
formatMessage() protected method

為控制台輸出著色訊息。

另請參閱 yii\helpers\Console::ansiFormat() 以取得有關如何指定訊息格式的詳細資訊。

protected string formatMessage ( $message, $format = [Console::FG_REDConsole::BOLD] )
$message string

要著色的訊息。

$format array

訊息格式。

return string

已著色的訊息。

                protected function formatMessage($message, $format = [Console::FG_RED, Console::BOLD])
{
    $stream = (PHP_SAPI === 'cli') ? \STDERR : \STDOUT;
    // try controller first to allow check for --color switch
    if (
        Yii::$app->controller instanceof \yii\console\Controller && Yii::$app->controller->isColorEnabled($stream)
        || Yii::$app instanceof \yii\console\Application && Console::streamSupportsAnsiColors($stream)
    ) {
        $message = Console::ansiFormat($message, $format);
    }
    return $message;
}

            
getBehavior() public method

定義於: yii\base\Component::getBehavior()

返回具名的行為對象。

public yii\base\Behavior|null getBehavior ( $name )
$name string

行為名稱

return yii\base\Behavior|null

行為物件,如果行為不存在則為 null

                public function getBehavior($name)
{
    $this->ensureBehaviors();
    return isset($this->_behaviors[$name]) ? $this->_behaviors[$name] : null;
}

            
getBehaviors() public method

定義於: yii\base\Component::getBehaviors()

返回附加到此元件的所有行為。

public yii\base\Behavior[] getBehaviors ( )
return yii\base\Behavior[]

附加到此元件的行為列表

                public function getBehaviors()
{
    $this->ensureBehaviors();
    return $this->_behaviors;
}

            
handleError() public method

定義於: yii\base\ErrorHandler::handleError()

處理 PHP 執行錯誤,例如警告和通知。

此方法用作 PHP 錯誤處理器。 它只會引發 yii\base\ErrorException

public boolean handleError ( $code, $message, $file, $line )
$code integer

引發的錯誤級別。

$message string

錯誤訊息。

$file string

引發錯誤的檔案名稱。

$line integer

引發錯誤的行號。

return boolean

一般錯誤處理器是否繼續執行。

throws yii\base\ErrorException

                public function handleError($code, $message, $file, $line)
{
    if (error_reporting() & $code) {
        // load ErrorException manually here because autoloading them will not work
        // when error occurs while autoloading a class
        if (!class_exists('yii\\base\\ErrorException', false)) {
            require_once __DIR__ . '/ErrorException.php';
        }
        $exception = new ErrorException($message, $code, $code, $file, $line);
        if (PHP_VERSION_ID < 70400) {
            // prior to PHP 7.4 we can't throw exceptions inside of __toString() - it will result a fatal error
            $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
            array_shift($trace);
            foreach ($trace as $frame) {
                if ($frame['function'] === '__toString') {
                    $this->handleException($exception);
                    if (defined('HHVM_VERSION')) {
                        flush();
                    }
                    exit(1);
                }
            }
        }
        throw $exception;
    }
    return false;
}

            
handleException() public method

定義於: yii\base\ErrorHandler::handleException()

處理未捕獲的 PHP 例外。

此方法實作為 PHP 例外處理器。

public void handleException ( $exception )
$exception Throwable

未捕獲的例外

                public function handleException($exception)
{
    if ($exception instanceof ExitException) {
        return;
    }
    $this->exception = $exception;
    // disable error capturing to avoid recursive errors while handling exceptions
    $this->unregister();
    // set preventive HTTP status code to 500 in case error handling somehow fails and headers are sent
    // HTTP exceptions will override this value in renderException()
    if (PHP_SAPI !== 'cli') {
        http_response_code(500);
    }
    try {
        $this->logException($exception);
        if ($this->discardExistingOutput) {
            $this->clearOutput();
        }
        $this->renderException($exception);
        if (!$this->silentExitOnException) {
            \Yii::getLogger()->flush(true);
            if (defined('HHVM_VERSION')) {
                flush();
            }
            exit(1);
        }
    } catch (\Exception $e) {
        // an other exception could be thrown while displaying the exception
        $this->handleFallbackExceptionMessage($e, $exception);
    } catch (\Throwable $e) {
        // additional check for \Throwable introduced in PHP 7
        $this->handleFallbackExceptionMessage($e, $exception);
    }
    $this->exception = null;
}

            
handleFallbackExceptionMessage() protected method (自 2.0.11 版本起可用)

定義於: yii\base\ErrorHandler::handleFallbackExceptionMessage()

處理在 handleException() 中例外處理期間拋出的例外。

protected void handleFallbackExceptionMessage ( $exception, $previousException )
$exception Throwable

在主要例外處理期間拋出的例外。

$previousException Throwable

handleException() 中處理的主要例外。

                protected function handleFallbackExceptionMessage($exception, $previousException)
{
    $msg = "An Error occurred while handling another error:\n";
    $msg .= (string) $exception;
    $msg .= "\nPrevious exception:\n";
    $msg .= (string) $previousException;
    if (YII_DEBUG) {
        if (PHP_SAPI === 'cli') {
            echo $msg . "\n";
        } else {
            echo '<pre>' . htmlspecialchars($msg, ENT_QUOTES, Yii::$app->charset) . '</pre>';
        }
        $msg .= "\n\$_SERVER = " . VarDumper::export($_SERVER);
    } else {
        echo 'An internal server error occurred.';
    }
    error_log($msg);
    if (defined('HHVM_VERSION')) {
        flush();
    }
    exit(1);
}

            
handleFatalError() public method

定義於: yii\base\ErrorHandler::handleFatalError()

處理致命的 PHP 錯誤。

public void handleFatalError ( )

                public function handleFatalError()
{
    unset($this->_memoryReserve);
    if (isset($this->_workingDirectory)) {
        // fix working directory for some Web servers e.g. Apache
        chdir($this->_workingDirectory);
        // flush memory
        unset($this->_workingDirectory);
    }
    $error = error_get_last();
    if ($error === null) {
        return;
    }
    // load ErrorException manually here because autoloading them will not work
    // when error occurs while autoloading a class
    if (!class_exists('yii\\base\\ErrorException', false)) {
        require_once __DIR__ . '/ErrorException.php';
    }
    if (!ErrorException::isFatalError($error)) {
        return;
    }
    if (!empty($this->_hhvmException)) {
        $this->exception = $this->_hhvmException;
    } else {
        $this->exception = new ErrorException(
            $error['message'],
            $error['type'],
            $error['type'],
            $error['file'],
            $error['line']
        );
    }
    unset($error);
    $this->logException($this->exception);
    if ($this->discardExistingOutput) {
        $this->clearOutput();
    }
    $this->renderException($this->exception);
    // need to explicitly flush logs because exit() next will terminate the app immediately
    Yii::getLogger()->flush(true);
    if (defined('HHVM_VERSION')) {
        flush();
    }
    $this->trigger(static::EVENT_SHUTDOWN);
    // ensure it is called after user-defined shutdown functions
    register_shutdown_function(function () {
        exit(1);
    });
}

            
handleHhvmError() public method (自 2.0.6 版本起可用)

定義於: yii\base\ErrorHandler::handleHhvmError()

處理 HHVM 執行錯誤,例如警告和通知。

此方法用作 HHVM 錯誤處理器。 它將儲存將在嚴重錯誤處理器中使用的例外

public boolean handleHhvmError ( $code, $message, $file, $line, $context, $backtrace )
$code integer

引發的錯誤級別。

$message string

錯誤訊息。

$file string

引發錯誤的檔案名稱。

$line integer

引發錯誤的行號。

$context mixed
$backtrace mixed

錯誤追蹤

return boolean

一般錯誤處理器是否繼續執行。

throws yii\base\ErrorException

                public function handleHhvmError($code, $message, $file, $line, $context, $backtrace)
{
    if ($this->handleError($code, $message, $file, $line)) {
        return true;
    }
    if (E_ERROR & $code) {
        $exception = new ErrorException($message, $code, $code, $file, $line);
        $ref = new \ReflectionProperty('\Exception', 'trace');
        $ref->setAccessible(true);
        $ref->setValue($exception, $backtrace);
        $this->_hhvmException = $exception;
    }
    return false;
}

            
hasEventHandlers() public method

定義於: yii\base\Component::hasEventHandlers()

返回指示是否有名稱事件附加任何處理程序的值。

public boolean hasEventHandlers ( $name )
$name string

事件名稱

return boolean

是否有任何處理器附加到事件。

                public function hasEventHandlers($name)
{
    $this->ensureBehaviors();
    if (!empty($this->_events[$name])) {
        return true;
    }
    foreach ($this->_eventWildcards as $wildcard => $handlers) {
        if (!empty($handlers) && StringHelper::matchWildcard($wildcard, $name)) {
            return true;
        }
    }
    return Event::hasHandlers($this, $name);
}

            
hasMethod() public method

Defined in: yii\base\Component::hasMethod()

返回指示是否定義了方法的值。

方法定義於:

  • 如果類別具有指定名稱的方法
  • 如果附加的行為具有給定名稱的方法(當 $checkBehaviors 為 true 時)。
public boolean hasMethod ( $name, $checkBehaviors true )
$name string

屬性名稱

$checkBehaviors boolean

是否將行為的方法視為此元件的方法

return boolean

方法是否已定義

                public function hasMethod($name, $checkBehaviors = true)
{
    if (method_exists($this, $name)) {
        return true;
    } elseif ($checkBehaviors) {
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $behavior) {
            if ($behavior->hasMethod($name)) {
                return true;
            }
        }
    }
    return false;
}

            
hasProperty() public method

Defined in: yii\base\Component::hasProperty()

返回指示是否為此元件定義了屬性的值。

屬性定義於:

  • 如果類別具有與指定名稱相關聯的 getter 或 setter 方法(在這種情況下,屬性名稱不區分大小寫);
  • 類別具有具有指定名稱的成員變數 (當 $checkVars 為 true 時);
  • 如果附加的行為具有給定名稱的屬性(當 $checkBehaviors 為 true 時)。

參見

public boolean hasProperty ( $name, $checkVars true, $checkBehaviors true )
$name string

屬性名稱

$checkVars boolean

是否將成員變數視為屬性

$checkBehaviors boolean

是否將行為的屬性視為此元件的屬性

return boolean

屬性是否已定義

                public function hasProperty($name, $checkVars = true, $checkBehaviors = true)
{
    return $this->canGetProperty($name, $checkVars, $checkBehaviors) || $this->canSetProperty($name, false, $checkBehaviors);
}

            
init() public method
public void init ( )

                public function init()
{
    $this->silentExitOnException = $this->silentExitOnException !== null ? $this->silentExitOnException : YII_ENV_TEST;
    parent::init();
}

            
logException() public method

Defined in: yii\base\ErrorHandler::logException()

記錄給定的例外。

public void logException ( $exception )
$exception Throwable

要記錄的例外

版本 描述
2.0.3 此方法現在為 public。

                public function logException($exception)
{
    $category = get_class($exception);
    if ($exception instanceof HttpException) {
        $category = 'yii\\web\\HttpException:' . $exception->statusCode;
    } elseif ($exception instanceof \ErrorException) {
        $category .= ':' . $exception->getSeverity();
    }
    Yii::error($exception, $category);
}

            
off() public method

Defined in: yii\base\Component::off()

從此元件分離現有的事件處理程序。

此方法與 on() 相反。

注意:如果為事件名稱傳遞了萬用字元模式,則只會移除使用此萬用字元註冊的處理常式,而使用與此萬用字元匹配的純名稱註冊的處理常式將會保留。

參見 on()

public boolean off ( $name, $handler null )
$name string

事件名稱

$handler callable|null

要移除的事件處理常式。如果為 null,則會移除附加到具名事件的所有處理常式。

return boolean

如果找到並分離處理常式

                public function off($name, $handler = null)
{
    $this->ensureBehaviors();
    if (empty($this->_events[$name]) && empty($this->_eventWildcards[$name])) {
        return false;
    }
    if ($handler === null) {
        unset($this->_events[$name], $this->_eventWildcards[$name]);
        return true;
    }
    $removed = false;
    // plain event names
    if (isset($this->_events[$name])) {
        foreach ($this->_events[$name] as $i => $event) {
            if ($event[0] === $handler) {
                unset($this->_events[$name][$i]);
                $removed = true;
            }
        }
        if ($removed) {
            $this->_events[$name] = array_values($this->_events[$name]);
            return true;
        }
    }
    // wildcard event names
    if (isset($this->_eventWildcards[$name])) {
        foreach ($this->_eventWildcards[$name] as $i => $event) {
            if ($event[0] === $handler) {
                unset($this->_eventWildcards[$name][$i]);
                $removed = true;
            }
        }
        if ($removed) {
            $this->_eventWildcards[$name] = array_values($this->_eventWildcards[$name]);
            // remove empty wildcards to save future redundant regex checks:
            if (empty($this->_eventWildcards[$name])) {
                unset($this->_eventWildcards[$name]);
            }
        }
    }
    return $removed;
}

            
on() public method

Defined in: yii\base\Component::on()

將事件處理程序附加到事件。

事件處理常式必須是有效的 PHP 回呼。以下是一些範例

function ($event) { ... }         // anonymous function
[$object, 'handleClick']          // $object->handleClick()
['Page', 'handleClick']           // Page::handleClick()
'handleClick'                     // global function handleClick()

事件處理常式必須使用以下簽名來定義:

function ($event)

其中 $event 是一個 yii\base\Event 物件,其中包含與事件相關聯的參數。

自 2.0.14 起,您可以將事件名稱指定為萬用字元模式

$component->on('event.group.*', function ($event) {
    Yii::trace($event->name . ' is triggered.');
});

參見 off()

public void on ( $name, $handler, $data null, $append true )
$name string

事件名稱

$handler callable

事件處理常式

$data mixed

當事件被觸發時,要傳遞給事件處理常式的資料。當調用事件處理常式時,可以透過 yii\base\Event::$data 存取此資料。

$append boolean

是否將新的事件處理常式附加到現有處理常式列表的末尾。如果為 false,則新的處理常式將插入到現有處理常式列表的開頭。

                public function on($name, $handler, $data = null, $append = true)
{
    $this->ensureBehaviors();
    if (strpos($name, '*') !== false) {
        if ($append || empty($this->_eventWildcards[$name])) {
            $this->_eventWildcards[$name][] = [$handler, $data];
        } else {
            array_unshift($this->_eventWildcards[$name], [$handler, $data]);
        }
        return;
    }
    if ($append || empty($this->_events[$name])) {
        $this->_events[$name][] = [$handler, $data];
    } else {
        array_unshift($this->_events[$name], [$handler, $data]);
    }
}

            
register() public method

Defined in: yii\base\ErrorHandler::register()

註冊此錯誤處理程序。

public void register ( )
版本 描述
2.0.32 如果已註冊錯誤處理常式,則此操作不會執行任何動作

                public function register()
{
    if (!$this->_registered) {
        ini_set('display_errors', false);
        set_exception_handler([$this, 'handleException']);
        if (defined('HHVM_VERSION')) {
            set_error_handler([$this, 'handleHhvmError']);
        } else {
            set_error_handler([$this, 'handleError']);
        }
        if ($this->memoryReserveSize > 0) {
            $this->_memoryReserve = str_repeat('x', $this->memoryReserveSize);
        }
        // to restore working directory in shutdown handler
        if (PHP_SAPI !== 'cli') {
            $this->_workingDirectory = getcwd();
        }
        register_shutdown_function([$this, 'handleFatalError']);
        $this->_registered = true;
    }
}

            
renderException() protected method

使用 ansi 格式呈現控制台輸出的例外。

protected void renderException ( $exception )
$exception Throwable

要呈現的例外。

                protected function renderException($exception)
{
    $previous = $exception->getPrevious();
    if ($exception instanceof UnknownCommandException) {
        // display message and suggest alternatives in case of unknown command
        $message = $this->formatMessage($exception->getName() . ': ') . $exception->command;
        $alternatives = $exception->getSuggestedAlternatives();
        if (count($alternatives) === 1) {
            $message .= "\n\nDid you mean \"" . reset($alternatives) . '"?';
        } elseif (count($alternatives) > 1) {
            $message .= "\n\nDid you mean one of these?\n    - " . implode("\n    - ", $alternatives);
        }
    } elseif ($exception instanceof UserException && ($exception instanceof Exception || !YII_DEBUG)) {
        $message = $this->formatMessage($exception->getName() . ': ') . $exception->getMessage();
    } elseif (YII_DEBUG) {
        if ($exception instanceof Exception) {
            $message = $this->formatMessage("Exception ({$exception->getName()})");
        } elseif ($exception instanceof ErrorException) {
            $message = $this->formatMessage($exception->getName());
        } else {
            $message = $this->formatMessage('Exception');
        }
        $message .= $this->formatMessage(" '" . get_class($exception) . "'", [Console::BOLD, Console::FG_BLUE])
            . ' with message ' . $this->formatMessage("'{$exception->getMessage()}'", [Console::BOLD]) //. "\n"
            . "\n\nin " . dirname($exception->getFile()) . DIRECTORY_SEPARATOR . $this->formatMessage(basename($exception->getFile()), [Console::BOLD])
            . ':' . $this->formatMessage($exception->getLine(), [Console::BOLD, Console::FG_YELLOW]) . "\n";
        if ($exception instanceof \yii\db\Exception && !empty($exception->errorInfo)) {
            $message .= "\n" . $this->formatMessage("Error Info:\n", [Console::BOLD]) . print_r($exception->errorInfo, true);
        }
        if ($previous === null) {
            $message .= "\n" . $this->formatMessage("Stack trace:\n", [Console::BOLD]) . $exception->getTraceAsString();
        }
    } else {
        $message = $this->formatMessage('Error: ') . $exception->getMessage();
    }
    if (PHP_SAPI === 'cli') {
        Console::stderr($message . "\n");
    } else {
        echo $message . "\n";
    }
    if (YII_DEBUG && $previous !== null) {
        $causedBy = $this->formatMessage('Caused by: ', [Console::BOLD]);
        if (PHP_SAPI === 'cli') {
            Console::stderr($causedBy);
        } else {
            echo $causedBy;
        }
        $this->renderException($previous);
    }
}

            
trigger() public method

Defined in: yii\base\Component::trigger()

觸發事件。

此方法表示事件的發生。它會調用事件的所有附加處理常式,包括類別層級的處理常式。

public void trigger ( $name, yii\base\Event $event null )
$name string

事件名稱

$event yii\base\Event|null

事件實例。如果未設定,將會建立預設的 yii\base\Event 物件。

                public function trigger($name, Event $event = null)
{
    $this->ensureBehaviors();
    $eventHandlers = [];
    foreach ($this->_eventWildcards as $wildcard => $handlers) {
        if (StringHelper::matchWildcard($wildcard, $name)) {
            $eventHandlers[] = $handlers;
        }
    }
    if (!empty($this->_events[$name])) {
        $eventHandlers[] = $this->_events[$name];
    }
    if (!empty($eventHandlers)) {
        $eventHandlers = call_user_func_array('array_merge', $eventHandlers);
        if ($event === null) {
            $event = new Event();
        }
        if ($event->sender === null) {
            $event->sender = $this;
        }
        $event->handled = false;
        $event->name = $name;
        foreach ($eventHandlers as $handler) {
            $event->data = $handler[1];
            call_user_func($handler[0], $event);
            // stop further handling if the event is handled
            if ($event->handled) {
                return;
            }
        }
    }
    // invoke class-level attached handlers
    Event::trigger($this, $name, $event);
}

            
unregister() public method

Defined in: yii\base\ErrorHandler::unregister()

通過恢復 PHP 錯誤和例外處理程序來取消註冊此錯誤處理程序。

public void unregister ( )
版本 描述
2.0.32 如果未註冊錯誤處理常式,則此操作不會執行任何動作

                public function unregister()
{
    if ($this->_registered) {
        $this->_memoryReserve = null;
        $this->_workingDirectory = null;
        restore_error_handler();
        restore_exception_handler();
        $this->_registered = false;
    }
}