123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- <?php
-
- /**
- * Smarty error handler
- *
- *
- * @package Smarty
- * @subpackage PluginsInternal
- * @author Uwe Tews
- *
- * @deprecated
- Smarty does no longer use @filemtime()
- */
- class Smarty_Internal_ErrorHandler
- {
- /**
- * contains directories outside of SMARTY_DIR that are to be muted by muteExpectedErrors()
- */
- public static $mutedDirectories = array();
- /**
- * error handler returned by set_error_handler() in self::muteExpectedErrors()
- */
- private static $previousErrorHandler = null;
-
- /**
- * Enable error handler to mute expected messages
- *
- * @return boolean
- */
- public static function muteExpectedErrors()
- {
- /*
- error muting is done because some people implemented custom error_handlers using
- http://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.
-
- Smarty deliberately uses @filemtime() over file_exists() and filemtime() in some places. Reasons include
- - @filemtime() is almost twice as fast as using an additional file_exists()
- - between file_exists() and filemtime() a possible race condition is opened,
- which does not exist using the simple @filemtime() approach.
- */
- $error_handler = array('Smarty_Internal_ErrorHandler', 'mutingErrorHandler');
- $previous = set_error_handler($error_handler);
- // avoid dead loops
- if ($previous !== $error_handler) {
- self::$previousErrorHandler = $previous;
- }
- }
-
- /**
- * Error Handler to mute expected messages
- *
- * @link http://php.net/set_error_handler
- *
- * @param integer $errno Error level
- * @param $errstr
- * @param $errfile
- * @param $errline
- * @param $errcontext
- *
- * @return bool
- */
- public static function mutingErrorHandler($errno, $errstr, $errfile, $errline, $errcontext)
- {
- $_is_muted_directory = false;
- // add the SMARTY_DIR to the list of muted directories
- if (!isset(self::$mutedDirectories[ SMARTY_DIR ])) {
- $smarty_dir = realpath(SMARTY_DIR);
- if ($smarty_dir !== false) {
- self::$mutedDirectories[ SMARTY_DIR ] =
- array('file' => $smarty_dir, 'length' => strlen($smarty_dir),);
- }
- }
- // walk the muted directories and test against $errfile
- foreach (self::$mutedDirectories as $key => &$dir) {
- if (!$dir) {
- // resolve directory and length for speedy comparisons
- $file = realpath($key);
- if ($file === false) {
- // this directory does not exist, remove and skip it
- unset(self::$mutedDirectories[ $key ]);
- continue;
- }
- $dir = array('file' => $file, 'length' => strlen($file),);
- }
- if (!strncmp($errfile, $dir[ 'file' ], $dir[ 'length' ])) {
- $_is_muted_directory = true;
- break;
- }
- }
- // pass to next error handler if this error did not occur inside SMARTY_DIR
- // or the error was within smarty but masked to be ignored
- if (!$_is_muted_directory || ($errno && $errno & error_reporting())) {
- if (self::$previousErrorHandler) {
- return call_user_func(self::$previousErrorHandler,
- $errno,
- $errstr,
- $errfile,
- $errline,
- $errcontext);
- } else {
- return false;
- }
- }
- }
- }
|