从 php 函数返回 html 的最佳方式


Best way to return html from php function?

所以我之前问过一个类似的问题,现在我只是更困惑了,所以我会用不同的方式问它......

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

我现在拥有的是:

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

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

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

1 我甚至需要费心像这样抽象我的代码吗?
2 如果是这样,哪种方式是最佳实践方法?和/或
3 我应该放弃网络开发并回到披萨外卖吗?:-''

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

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

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

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

  1. 是的,当然,你做事的方式没有灵活性。
  2. 理想情况下,您应该将所有 HTML 与 PHP 分开,至少是函数 - 唯一可以远程接受的地方是在使用 PHP 仅显示函数输出的视图中。
  3. 比萨饼!开个玩笑,但披萨永远不够!?

看看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
}

你可以这样做:

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

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

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

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

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

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

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,我的所有错误/日志记录消息都整齐地显示在屏幕上。我知道这并不能直接回答您的问题,但我确实发现它非常方便,当您开始时对您来说可能是值得的。它肯定胜过注释掉然后取消注释可能数十条消息。您可以将这些输出保留在对象中而不必担心,并让它们显示所需的所有详细信息。

如果你在某个时候可能有很多错误,那么这样做

<?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 () {}块中。