我想写一个简单的模板解析对象,我的代码工作得很好。问题是主页面中的任何echo命令或者应该由ob_start缓冲。触发破坏时的错误处理路由并在线52上死亡。但是这不会运行。有任何想法吗?使用ob_start()时无法捕获回显或错误()
<?php
define('ERROR_FOLDER', 'includes/error/');
define('HTML_FOLDER', 'includes/pages/');
class HTML{
/*
Takes a template file and replaces all instances of <!--VARNAME--> with the value inputed.
All values should be strings.
*/
private $template;
private $vars; //array of user defined variables
function __construct($filePath=''){
//stop writing anything to the page-html-output
ob_start();
//read contents of template
$this->template=file_get_contents(HTML_FOLDER.$filePath);
}
function __destruct() {
echo $this->execute();
}
function getCode() {
return $this->execute();
}
public function get($var) {
return $this->vars[$var];
}
public function set($var,$value) {
$this->vars[$var]=$value;
}
public function append($var,$value) {
$this->vars[$var].=$value;
}
/* ********************************************************************************************************
* Private Functions *
******************************************************************************************************** */
private function execute() {
//handel any errors
$errors=ob_get_contents();
if (strlen($errors>0)) {
echo $errors;die();
//create error file
//name: date_time_random_pageName
$fileName=DateTime::format("Y-m-d_H-i-s-u").'_'.rand(10000,99999).'_'.strtok($_SERVER["REQUEST_URI"],'?').'.txt';
$errorMessage='Error For: ' . $_SERVER[REQUEST_URI] . "\r\n" . $errors;
file_put_contents(ERROR_FOLDER.$fileName, $errorMessage);
}
//erase any error messages
ob_end_clean();
//get template
$html=$this->template;
//create search arrays
$from=array();
$to=array();
foreach ($this->vars as $key=>$value) {
$from[]='<!!--'.$key.'--!!>';
$to[]=$value;
}
//replace any vars added
$html=str_replace($from,$to,$html);
//minimize html text adapted from http://stackoverflow.com/questions/6225351/how-to-minify-php-page-html-output
$from = array(
'/\>[^\S ]+/s', // strip whitespaces after tags, except space
'/[^\S ]+\</s', // strip whitespaces before tags, except space
'/(\s)+/s', // shorten multiple whitespace sequences
'/<!--.*?-->|\t|(?:\r?\n[ \t]*)+/s', // removes comments
'/<!!--.*?--!!>|\t|(?:\r?\n[ \t]*)+/s' // removes unused vars
);
$to = array(
'>',
'<',
'\\1',
'',
''
);
$html = preg_replace($from, $to, $html);
return $html;
}
}
?>
这里是一个测试脚本
<?php
require_once "includes/HTML.php";
$page=new HTML('template-main.html');
$page->set('list','Hello World');
echo "should get saved to file and never show up on screen.";
?>
模板main.html中应该有
<!!--list--!!>
我希望看到的是: 应该得到保存到文件,从不露面在屏幕上。因为这应该存储在对象的第51行之后的$ errors中。
我得到的是:你好世界
我不希望任何东西被写入用户直到对象被破坏。主程序的任何Echo命令都应视为错误。 –
如果您通过ob_end_flush更改ob_end_clean,该怎么办? 编辑:ob_end_clean只清除缓冲区,它ne nevers做任何事情 ,而ob_end_flush在冲洗它之前打印它。 – SamyQc
ob_get_contents()更高的几行是假设得到它但没有。我不想打印它。 –