从php函数返回html的最佳方法?

时间:2012-08-07 08:45:46

标签: php html

所以我早些时候问了一个类似的问题,现在我只是更加困惑,所以我会以不同的方式问这个问题......

我正在尝试做的是抽象我的php并将我的验证器中用作错误消息的html的部分放入将html返回到页面中所需位置的函数中。

我现在拥有的是:

<section>
<?php 
if($errMsg)
{
    errMsg();
}
?>
</section>

<?php
function errMsg()
{
       ?>
       <section>
           <p>O crap!  There was an error</p>
       </section>
       <?php
}
?>

但是在我之前提到的问题中,我被告知这样做是一种“肮脏的黑客”,并且在这种情况下使用返回更好。但是要使用return我需要将所有返回的html分配给var并且为此我需要将html放在一个字符串中。我宁愿避免在一个字符串中放置两行以上的html,因为这样做的引号数量会很痛苦。

所以我想我要么使用heredoc语法,要么使用ob_start / ob_get_clean函数。我想知道的是。

1我是否需要费心去抽象我的代码呢? 2如果是这样,哪种方式是最好的做法?和/或
3我应该放弃网络开发并回到披萨送货上吗? : - \

7 个答案:

答案 0 :(得分:4)

我不会返回任何HTML。只需从函数返回错误消息,然后在更合适的位置构建html。例如模板内部。

答案 1 :(得分:4)

  1. 是的,你没有灵活性。
  2. 您应该理想地将所有HTML与PHP分开,至少是函数 - 唯一可以远程接受的地方是使用PHP来显示函数输出的视图。
  3. 披萨!开个玩笑,但永远不会有足够的披萨!?
  4. 看一下Zend框架http://framework.zend.com/manual/en/zend.application.quick-start.html,它们会转发错误消息,这些消息没有被错误处理程序捕获,然后错误处理程序使用自己的视图来呈现错误。

    或者没有框架:

    try{
         //do work here and throw exception on error
    }
    catch (Exception $e)
    {
         //do error logging/display error
         //or preferably load another class which handles your error and produces output
    }
    

答案 2 :(得分:4)

1:你不需要,但如果做得好,你就可以。

2:为此,我建议您在PHP错误函数中使用EOF,它看起来像这样:

function errMsg()
{
       $error = <<<EOF 
<section>
<p>O crap!  There was an error</p>
</section>
EOF;
}

答案 3 :(得分:2)

你可以这样做:

<?php if($errMgs){ ?>
<section>
    <p><?php echo errMsg(); ?></p>
</section>
<?php } ?>

通常,我尽量不通过PHP回显HTML。为什么?因为如果设计师需要处理我的代码,我不希望他/她担心我的函数正在吐出的HTML。

答案 4 :(得分:2)

将html代码移动到单独的文件error.php中。之后,您只需捕获输出:

function errMsg()
{
    ob_start();
    include '/path/to/error.php';
    return ob_get_clean();
}

// ...

echo errMsg();

答案 5 :(得分:2)

首先,我同意上述帖子。不要格式化,只需让函数返回裸错误消息,如果需要在需要显示它的位置进行适当格式化。

其次,我总是发现能够快速打开和关闭错误并测试消息是有用的。由于我的大多数代码都是面向对象的,我可能只希望一次从一个对象弹出消息,我通常在我的类中有这样的东西:

class userObject
{
    public $history;// = historyObject;
    public $userName;
    public $userRelation;
    public $userCode;
    private $mySQLAccessData;
    private $isDebug=false;

    public function makeHistoryObject($KPI, $KPIType)
    {
        if($this->isDebug){echo "Having a go at creating ".$this->userName.".<br>";}
        $this->history = new historyObject($this->userCode, $KPI, $KPIType);
    }
}

我放了一个private元素,默认情况下我将false作为true。如果我需要调试或进行更改,我将其设置为{{1}},我的所有错误/日志消息都会整齐地显示在屏幕上。我知道这不是直接回答你的问题,但是我确实发现它是所以方便你在开始时可能值得。它肯定胜过评论,然后取消注释潜在的数十条消息。您可以将这些输出留在对象中而不必担心,并让它们显示您需要的所有细节。

答案 6 :(得分:0)

如果您在某些时候可能有多少错误,那么就这样做

<?php
$errors = array();

if (!$item = getItem($id)) {
    addError("No item $id");
}

if (!updateUser($user, $id)) {
    addError("Can not update user");
}

if (!updateItemPicture($id, $picture)) {
    addError("Can not add picture to $id");
}

function addError($error) {
    global $errors; $errors []= $error;
}

function hasErrors() {
   global $errors; return count($errors);
}

function printErrors() {
   if (!hasErrors()) return;

   print "<ul class='errors'><li>" . join("</li><li>", $errors) . "</li></ul";
}


printErrors();
?>

这是为了防止您使用面向对象的方式。并假设所有错误都不是致命的并且被try {} catch () {}块捕获。