2015-11-19 36 views
0

我想写一个简单的模板解析对象,我的代码工作得很好。问题是主页面中的任何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中。

我得到的是:你好世界

回答

0

尝试围绕你的回声ob_end_flush()函数;和ob_start();

例如:

ob_end_flush(); 

# CODE THAT NEEDS IMMEDIATE FLUSHING 

ob_start(); 

源:How to flush output after each `echo` call?

+0

我不希望任何东西被写入用户直到对象被破坏。主程序的任何Echo命令都应视为错误。 –

+0

如果您通过ob_end_flush更改ob_end_clean,该怎么办? 编辑:ob_end_clean只清除缓冲区,它ne nevers做任何事情 ,而ob_end_flush在冲洗它之前打印它。 – SamyQc

+0

ob_get_contents()更高的几行是假设得到它但没有。我不想打印它。 –

0

如果(strlen的($错误> 0)){

应该是

如果(strlen的($错误)> 0 ){