类 yii\console\ErrorHandler
ErrorHandler 处理未捕获的 PHP 错误和异常。
ErrorHandler 默认情况下被配置为 yii\base\Application 中的应用程序组件。可以通过 Yii::$app->errorHandler
访问该实例。
公共属性
属性 | 类型 | 描述 | 定义于 |
---|---|---|---|
$behaviors | yii\base\Behavior[] | 附加到此组件的行为列表。 | yii\base\Component |
$discardExistingOutput | 布尔值 | 是否在显示错误之前丢弃任何现有的页面输出。 | yii\base\ErrorHandler |
$exception | Throwable|null | 当前正在处理的异常。 | yii\base\ErrorHandler |
$memoryReserveSize | 整数 | 保留内存的大小。 | yii\base\ErrorHandler |
$silentExitOnException | 布尔值 | 如果为真 - handleException() 将使用 ExitCode::OK 完成脚本。 |
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 |
方法详情
定义于: yii\base\Component::__call()
调用不是类方法的命名方法。
此方法将检查是否任何附加的行为具有命名方法,如果可用,将执行它。
不要直接调用此方法,因为它是 PHP 魔术方法,当调用未知方法时会隐式调用。
public mixed __call ( $name, $params ) | ||
$name | 字符串 |
方法名 |
$params | 数组 |
方法参数 |
返回 | 混合 |
方法返回值 |
---|---|---|
抛出 | 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()");
}
public void __clone ( ) |
public function __clone()
{
$this->_events = [];
$this->_eventWildcards = [];
$this->_behaviors = null;
}
定义于: yii\base\BaseObject::__construct()
构造函数。
默认实现做了两件事
- 使用给定的配置
$config
初始化对象。 - 调用 init()。
如果此方法在子类中被重写,建议
- 构造函数的最后一个参数是配置数组,就像这里的
$config
一样。 - 在构造函数的末尾调用父类实现。
public void __construct ( $config = [] ) | ||
$config | 数组 |
将用于初始化对象属性的键值对 |
public function __construct($config = [])
{
if (!empty($config)) {
Yii::configure($this, $config);
}
$this->init();
}
定义于: yii\base\Component::__get()
返回组件属性的值。
此方法将按以下顺序检查并相应地采取行动
- 由 getter 定义的属性:返回 getter 的结果
- 行为的属性:返回行为的属性值
不要直接调用此方法,因为它是一个 PHP 魔术方法,将在执行 $value = $component->property;
时隐式调用。
另见 __set()。
public mixed __get ( $name ) | ||
$name | 字符串 |
属性名 |
返回 | 混合 |
属性值或行为属性的值 |
---|---|---|
抛出 | yii\base\UnknownPropertyException |
如果属性未定义 |
抛出 | 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);
}
定义于: yii\base\Component::__isset()
检查属性是否已设置,即定义且不为空。
此方法将按以下顺序检查并相应地采取行动
- 由 setter 定义的属性:返回属性是否已设置
- 行为的属性:返回属性是否已设置
- 对于不存在的属性,返回
false
不要直接调用此方法,因为它是一个 PHP 魔术方法,将在执行 isset($component->property)
时隐式调用。
public boolean __isset ( $name ) | ||
$name | 字符串 |
属性名或事件名 |
返回 | 布尔值 |
命名的属性是否已设置 |
---|
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;
}
定义于: yii\base\Component::__set()
设置组件属性的值。
此方法将按以下顺序检查并相应地采取行动
- 由 setter 定义的属性:设置属性值
- "on xyz" 格式的事件:将处理程序附加到事件 "xyz"
- "as xyz" 格式的行为:附加名为 "xyz" 的行为
- 行为的属性:设置行为的属性值
不要直接调用此方法,因为它是一个 PHP 魔术方法,将在执行 $component->property = $value;
时隐式调用。
另见 __get()。
public void __set ( $name, $value ) | ||
$name | 字符串 |
属性名或事件名 |
$value | 混合 |
属性值 |
抛出 | yii\base\UnknownPropertyException |
如果属性未定义 |
---|---|---|
抛出 | 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);
}
定义于: yii\base\Component::__unset()
将组件属性设置为 null。
此方法将按以下顺序检查并相应地采取行动
- 由 setter 定义的属性:将属性值设置为 null
- 行为的属性:将属性值设置为 null
不要直接调用此方法,因为它是一个 PHP 魔术方法,将在执行 unset($component->property)
时隐式调用。
public void __unset ( $name ) | ||
$name | 字符串 |
属性名 |
抛出 | 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);
}
定义于: yii\base\Component::attachBehavior()
将行为附加到此组件。
此方法将根据给定的配置创建行为对象。之后,行为对象将通过调用 yii\base\Behavior::attach() 方法附加到此组件。
另见 detachBehavior()。
public yii\base\Behavior attachBehavior ( $name, $behavior ) | ||
$name | 字符串 |
行为的名称。 |
$behavior | string|array|yii\base\Behavior |
行为配置。这可以是以下之一
|
返回 | yii\base\Behavior |
行为对象 |
---|
public function attachBehavior($name, $behavior)
{
$this->ensureBehaviors();
return $this->attachBehaviorInternal($name, $behavior);
}
定义于: yii\base\Component::attachBehaviors()
将行为列表附加到组件。
每个行为都由其名称索引,并且应该是一个 yii\base\Behavior 对象,一个指定行为类的字符串,或者一个用于创建行为的配置数组。
另见 attachBehavior()。
public void attachBehaviors ( $behaviors ) | ||
$behaviors | 数组 |
要附加到组件的行为列表 |
public function attachBehaviors($behaviors)
{
$this->ensureBehaviors();
foreach ($behaviors as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
定义于: yii\base\Component::behaviors()
返回此组件应表现为的行为列表。
子类可以重写此方法来指定它们想要表现的行为。
此方法的返回值应是行为对象或配置的数组,以行为名称为索引。行为配置可以是指定行为类的字符串,也可以是以下结构的数组
'behaviorName' => [
'class' => 'BehaviorClass',
'property1' => 'value1',
'property2' => 'value2',
]
注意,行为类必须扩展自 yii\base\Behavior。行为可以使用名称或匿名方式附加。当使用名称作为数组键时,使用此名称,行为可以在以后使用 getBehavior() 检索,或使用 detachBehavior() 分离。匿名行为不能检索或分离。
在此方法中声明的行为将自动附加到组件(按需)。
public array behaviors ( ) | ||
返回 | 数组 |
行为配置。 |
---|
public function behaviors()
{
return [];
}
定义于: yii\base\Component::canGetProperty()
返回一个值,指示是否可以读取属性。
属性可以被读取,如果
- 该类有一个与指定名称关联的 getter 方法(在这种情况下,属性名称是不区分大小写的);
- 该类有一个具有指定名称的成员变量(当
$checkVars
为 true 时); - 附加的行为具有给定名称的可读属性(当
$checkBehaviors
为 true 时)。
另见 canSetProperty()。
public boolean canGetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | 字符串 |
属性名 |
$checkVars | 布尔值 |
是否将成员变量视为属性 |
$checkBehaviors | 布尔值 |
是否将行为的属性视为此组件的属性 |
返回 | 布尔值 |
该属性是否可读 |
---|
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;
}
定义于: yii\base\Component::canSetProperty()
返回一个值,指示是否可以设置属性。
如果可以写入属性,则满足以下条件:
- 类具有与指定名称关联的 setter 方法(在这种情况下,属性名称不区分大小写);
- 该类有一个具有指定名称的成员变量(当
$checkVars
为 true 时); - 附加的行为具有给定名称的可写属性(当
$checkBehaviors
为 true 时)。
另请参见 canGetProperty().
public boolean canSetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | 字符串 |
属性名 |
$checkVars | 布尔值 |
是否将成员变量视为属性 |
$checkBehaviors | 布尔值 |
是否将行为的属性视为此组件的属性 |
返回 | 布尔值 |
该属性是否可写 |
---|
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;
}
::class
代替。
定义于: yii\base\BaseObject::className()
返回此类的完全限定名称。
public static string className ( ) | ||
返回 | 字符串 |
此类的完全限定名称。 |
---|
public static function className()
{
return get_called_class();
}
定义于: 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();
}
}
}
定义于: 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);
}
定义于: yii\base\ErrorHandler::convertExceptionToString()
将异常转换为简单字符串。
public static string convertExceptionToString ( $exception ) | ||
$exception | Throwable |
要转换的异常 |
返回 | 字符串 |
异常的字符串表示形式。 |
---|
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.';
}
定义于: yii\base\ErrorHandler::convertExceptionToVerboseString()
将异常转换为包含有关异常及其跟踪的详细信息的字符串。
public static string convertExceptionToVerboseString ( $exception ) | ||
$exception | Throwable |
要转换的异常 |
返回 | 字符串 |
异常的字符串表示形式。 |
---|
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;
}
public yii\base\Behavior|null detachBehavior ( $name ) | ||
$name | 字符串 |
行为的名称。 |
返回 | 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;
}
定义于: yii\base\Component::detachBehaviors()
从组件中分离所有行为。
public void detachBehaviors ( ) |
public function detachBehaviors()
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $name => $behavior) {
$this->detachBehavior($name);
}
}
定义于: 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);
}
}
}
为控制台输出着色消息。
另请参见 yii\helpers\Console::ansiFormat() 以了解有关如何指定消息格式的详细信息。
protected string formatMessage ( $message, $format = [Console::FG_RED, Console::BOLD] ) | ||
$message | 字符串 |
要着色的消息。 |
$format | 数组 |
消息格式。 |
返回 | 字符串 |
着色的消息。 |
---|
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;
}
定义于: yii\base\Component::getBehavior()
返回命名行为对象。
public yii\base\Behavior|null getBehavior ( $name ) | ||
$name | 字符串 |
行为名称 |
返回 | yii\base\Behavior|null |
行为对象,如果行为不存在,则为 null |
---|
public function getBehavior($name)
{
$this->ensureBehaviors();
return isset($this->_behaviors[$name]) ? $this->_behaviors[$name] : null;
}
定义于: yii\base\Component::getBehaviors()
返回附加到此组件的所有行为。
public yii\base\Behavior[] getBehaviors ( ) | ||
返回 | yii\base\Behavior[] |
附加到此组件的行为列表 |
---|
public function getBehaviors()
{
$this->ensureBehaviors();
return $this->_behaviors;
}
定义于: yii\base\ErrorHandler::handleError()
处理 PHP 执行错误,例如警告和提示。
此方法用作 PHP 错误处理程序。它将简单地引发一个 yii\base\ErrorException。
public boolean handleError ( $code, $message, $file, $line ) | ||
$code | 整数 |
引发的错误级别。 |
$message | 字符串 |
错误消息。 |
$file | 字符串 |
引发错误的文件名。 |
$line | 整数 |
引发错误的行号。 |
返回 | 布尔值 |
是否继续执行正常的错误处理程序。 |
---|---|---|
抛出 | 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;
}
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;
}
定义于: 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);
}
定义于: 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);
});
}
定义于: yii\base\ErrorHandler::handleHhvmError()
处理 HHVM 执行错误,例如警告和提示。
此方法用作 HHVM 错误处理程序。它将存储将在致命错误处理程序中使用的异常
public boolean handleHhvmError ( $code, $message, $file, $line, $context, $backtrace ) | ||
$code | 整数 |
引发的错误级别。 |
$message | 字符串 |
错误消息。 |
$file | 字符串 |
引发错误的文件名。 |
$line | 整数 |
引发错误的行号。 |
$context | 混合 | |
$backtrace | 混合 |
错误的跟踪 |
返回 | 布尔值 |
是否继续执行正常的错误处理程序。 |
---|---|---|
抛出 | 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;
}
定义于: yii\base\Component::hasEventHandlers()
返回一个值,指示是否将任何处理程序附加到命名事件。
public boolean hasEventHandlers ( $name ) | ||
$name | 字符串 |
事件名称 |
返回 | 布尔值 |
是否为事件附加了任何处理程序。 |
---|
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);
}
定义于: yii\base\Component::hasMethod()
返回一个值,指示是否定义了方法。
如果定义了一个方法
- 该类具有指定名称的方法
- 附加的行为具有给定名称的方法(当
$checkBehaviors
为 true 时)。
public boolean hasMethod ( $name, $checkBehaviors = true ) | ||
$name | 字符串 |
属性名 |
$checkBehaviors | 布尔值 |
是否将行为的方法视为此组件的方法 |
返回 | 布尔值 |
方法是否已定义 |
---|
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;
}
定义于: yii\base\Component::hasProperty()
返回一个值,指示是否为此组件定义了属性。
如果定义了一个属性
- 该类具有与指定名称关联的 getter 或 setter 方法(在这种情况下,属性名称不区分大小写);
- 该类有一个具有指定名称的成员变量(当
$checkVars
为 true 时); - 附加的行为具有给定名称的属性(当
$checkBehaviors
为 true 时)。
另见
public boolean hasProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | 字符串 |
属性名 |
$checkVars | 布尔值 |
是否将成员变量视为属性 |
$checkBehaviors | 布尔值 |
是否将行为的属性视为此组件的属性 |
返回 | 布尔值 |
属性是否已定义 |
---|
public function hasProperty($name, $checkVars = true, $checkBehaviors = true)
{
return $this->canGetProperty($name, $checkVars, $checkBehaviors) || $this->canSetProperty($name, false, $checkBehaviors);
}
public void init ( ) |
public function init()
{
$this->silentExitOnException = $this->silentExitOnException !== null ? $this->silentExitOnException : YII_ENV_TEST;
parent::init();
}
定义于: yii\base\ErrorHandler::logException()
记录给定的异常。
public void logException ( $exception ) | ||
$exception | Throwable |
要记录的异常 |
版本 | 描述 |
---|---|
2.0.3 | 此方法现在是公共的。 |
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);
}
定义于: yii\base\Component::off()
从此组件中分离现有的事件处理程序。
此方法与 on() 相反。
注意:如果事件名称传递了通配符模式,则只会删除使用此通配符注册的处理程序,而使用与该通配符匹配的普通名称注册的处理程序将保留。
另见 on()。
public boolean off ( $name, $handler = null ) | ||
$name | 字符串 |
事件名称 |
$handler | callable|null |
要移除的事件处理程序。如果它是 null,则将移除与命名事件关联的所有处理程序。 |
返回 | 布尔值 |
如果找到并分离了处理程序 |
---|
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;
}
将事件处理程序附加到事件。
事件处理程序必须是一个有效的 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 | 字符串 |
事件名称 |
$handler | callable |
事件处理程序 |
$data | 混合 |
触发事件时传递给事件处理程序的数据。当调用事件处理程序时,可以通过 yii\base\Event::$data 访问此数据。 |
$append | 布尔值 |
是否将新的事件处理程序追加到现有处理程序列表的末尾。如果为 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]);
}
}
定义于: 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;
}
}
使用 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);
}
}
public void trigger ( $name, yii\base\Event $event = null ) | ||
$name | 字符串 |
事件名称 |
$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);
}
定义于: 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;
}
}
注册 或 登录 以发表评论。