--- /dev/null
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use ErrorException;
+
+/**
+ * ErrorHandler that can be used to catch internal PHP errors
+ * and convert to an ErrorException instance.
+ */
+abstract class ErrorHandler
+{
+ /**
+ * Active stack
+ *
+ * @var array
+ */
+ protected static $stack = [];
+
+ /**
+ * Check if this error handler is active
+ *
+ * @return bool
+ */
+ public static function started()
+ {
+ return (bool) static::getNestedLevel();
+ }
+
+ /**
+ * Get the current nested level
+ *
+ * @return int
+ */
+ public static function getNestedLevel()
+ {
+ return count(static::$stack);
+ }
+
+ /**
+ * Starting the error handler
+ *
+ * @param int $errorLevel
+ */
+ public static function start($errorLevel = \E_WARNING)
+ {
+ if (! static::$stack) {
+ set_error_handler([get_called_class(), 'addError'], $errorLevel);
+ }
+
+ static::$stack[] = null;
+ }
+
+ /**
+ * Stopping the error handler
+ *
+ * @param bool $throw Throw the ErrorException if any
+ * @return null|ErrorException
+ * @throws ErrorException If an error has been catched and $throw is true
+ */
+ public static function stop($throw = false)
+ {
+ $errorException = null;
+
+ if (static::$stack) {
+ $errorException = array_pop(static::$stack);
+
+ if (! static::$stack) {
+ restore_error_handler();
+ }
+
+ if ($errorException && $throw) {
+ throw $errorException;
+ }
+ }
+
+ return $errorException;
+ }
+
+ /**
+ * Stop all active handler
+ *
+ * @return void
+ */
+ public static function clean()
+ {
+ if (static::$stack) {
+ restore_error_handler();
+ }
+
+ static::$stack = [];
+ }
+
+ /**
+ * Add an error to the stack
+ *
+ * @param int $errno
+ * @param string $errstr
+ * @param string $errfile
+ * @param int $errline
+ * @return void
+ */
+ public static function addError($errno, $errstr = '', $errfile = '', $errline = 0)
+ {
+ $stack = & static::$stack[count(static::$stack) - 1];
+ $stack = new ErrorException($errstr, 0, $errno, $errfile, $errline, $stack);
+ }
+}