forked from SimplesIP/pabx-app
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
3.2 KiB
101 lines
3.2 KiB
<?php |
|
|
|
/** |
|
* Smarty error handler to fix new error levels in PHP8 for backwards compatibility |
|
* |
|
* @package Smarty |
|
* @subpackage PluginsInternal |
|
* @author Simon Wisselink |
|
* |
|
*/ |
|
class Smarty_Internal_ErrorHandler |
|
{ |
|
|
|
/** |
|
* Allows {$foo} where foo is unset. |
|
* @var bool |
|
*/ |
|
public $allowUndefinedVars = true; |
|
|
|
/** |
|
* Allows {$foo.bar} where bar is unset and {$foo.bar1.bar2} where either bar1 or bar2 is unset. |
|
* @var bool |
|
*/ |
|
public $allowUndefinedArrayKeys = true; |
|
|
|
/** |
|
* Allows {$foo->bar} where bar is not an object (e.g. null or false). |
|
* @var bool |
|
*/ |
|
public $allowDereferencingNonObjects = true; |
|
|
|
private $previousErrorHandler = null; |
|
|
|
/** |
|
* Enable error handler to intercept errors |
|
*/ |
|
public function activate() { |
|
/* |
|
Error muting is done because some people implemented custom error_handlers using |
|
https://php.net/set_error_handler and for some reason did not understand the following paragraph: |
|
|
|
It is important to remember that the standard PHP error handler is completely bypassed for the |
|
error types specified by error_types unless the callback function returns FALSE. |
|
error_reporting() settings will have no effect and your error handler will be called regardless - |
|
however you are still able to read the current value of error_reporting and act appropriately. |
|
Of particular note is that this value will be 0 if the statement that caused the error was |
|
prepended by the @ error-control operator. |
|
*/ |
|
$this->previousErrorHandler = set_error_handler([$this, 'handleError']); |
|
} |
|
|
|
/** |
|
* Disable error handler |
|
*/ |
|
public function deactivate() { |
|
restore_error_handler(); |
|
$this->previousErrorHandler = null; |
|
} |
|
|
|
/** |
|
* Error Handler to mute expected messages |
|
* |
|
* @link https://php.net/set_error_handler |
|
* |
|
* @param integer $errno Error level |
|
* @param $errstr |
|
* @param $errfile |
|
* @param $errline |
|
* @param $errcontext |
|
* |
|
* @return bool |
|
*/ |
|
public function handleError($errno, $errstr, $errfile, $errline, $errcontext = []) |
|
{ |
|
|
|
if ($this->allowUndefinedVars && preg_match( |
|
'/^(Attempt to read property "value" on null|Trying to get property (\'value\' )?of non-object)/', |
|
$errstr |
|
)) { |
|
return; // suppresses this error |
|
} |
|
|
|
if ($this->allowUndefinedArrayKeys && preg_match( |
|
'/^(Undefined index|Undefined array key|Trying to access array offset on value of type)/', |
|
$errstr |
|
)) { |
|
return; // suppresses this error |
|
} |
|
|
|
if ($this->allowDereferencingNonObjects && preg_match( |
|
'/^Attempt to read property ".+?" on/', |
|
$errstr |
|
)) { |
|
return; // suppresses this error |
|
} |
|
|
|
// pass all other errors through to the previous error handler or to the default PHP error handler |
|
return $this->previousErrorHandler ? |
|
call_user_func($this->previousErrorHandler, $errno, $errstr, $errfile, $errline, $errcontext) : false; |
|
} |
|
}
|
|
|