file = $file; if ($line) { $this->line = $line; } parent::__construct($message, $code, $previous); } public function syntaxHighlight($code) { $code = preg_replace('/"(.*?)"/U', '"$1"', $code); $code = preg_replace('/(\s)\b(.*?)((\b|\s)\()/U', '$1$2$3', $code); $code = preg_replace('/(class)(.+)\s/', '$0', $code); $code = preg_replace('/(\/\/)(.+)\s/', '$0', $code); $code = preg_replace('/(\/\*.*?\*\/)/s', '$0', $code); $code = preg_replace('/(\[|\{|\}|\])/', '$1', $code); $code = preg_replace('/(\(|\)|\->|\=>)/', '$1', $code); $code = preg_replace('/(\$[a-zA-Z0-9_]+)/', '$1', $code); $code = preg_replace('/\b(print|echo|new|function|return|true|false|namespace|use|class|extends|implements)\b/', '$1', $code); return $code; } /** * @param $filename * @param $line * @return string */ private function readErrorFile($filename, $line) { $file = file($filename); $totalLine = count($file); $offset = 6; $offsetStart = $line - $offset; $offsetEnd = $line + $offset; $start = ($offsetStart <= 0) ? 2 : $offsetStart; $end = ($offsetEnd > $totalLine) ? $totalLine : $offsetEnd; $content = ''; for ($i = $start; $i <= $end; $i++) { $content .= '' . $i . ''; $content .= $this->syntaxHighlight(htmlspecialchars($file[$i - 1])) . ''; } return '
' . $content . '
'; } /** * @param \Exception|null $exception */ public function handler($exception = null) { if (DEBUG) { $message = htmlspecialchars($exception->getMessage()); $file = $exception->getFile(); $line = $exception->getLine(); $trace = $exception->getTraceAsString(); $content = '
' . $this->readErrorFile($file, $line) . '
'; $detail = '
位于 ' . $file . ' 第 ' . $line . ' 行
'; $detail .= $content . '
查看Trace信息'; $detail .= '
'; } else { $message = '系统错误,请稍后重试。'; $detail = '请打开调试模式以查看详细信息。'; } $message = $this->translateMessage($message); $content = << 系统错误

{$message}

{$detail}
TOP-framework
EOF; header("HTTP/1.1 404 Not Found"); echo $content; } public function translateMessage($message) { $message = str_ireplace( ['Undefined variable', 'Undefined offset', 'Undefined index', 'syntax error,', 'Use of undefined constant'], ['未定义变量', '未定义数组下标', '未定义数组索引', '语法错误:', '使用未定义常量:'], $message ); return $message; } }