5

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

我要做的是抽象我的 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 我是否应该放弃 Web 开发并返回披萨外卖?:-\

4

7 回答 7

5

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

2:要做到这一点,我建议你EOF在你的 PHP 错误函数中使用,它看起来像这样:

function errMsg()
{
       $error = <<<EOF 
<section>
<p>O crap!  There was an error</p>
</section>
EOF;
}
于 2012-08-07T08:51:57.403 回答
4

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

于 2012-08-07T08:51:01.920 回答
4
  1. 是的,当然,你的工作方式没有灵活性。
  2. 理想情况下,您应该将所有 HTML 与 PHP 分开,至少是函数 - 唯一可以远程接受的地方是在使用 PHP 来显示函数输出的视图中。
  3. 比萨!开个玩笑,但披萨永远都不够!?

看看 Zend 框架http://framework.zend.com/manual/en/zend.application.quick-start.html他们将没有被捕获的错误消息转发给错误处理程序,然后使用它自己的视图呈现错误。

或 w/oa 框架:

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
}
于 2012-08-07T08:51:24.970 回答
2

你可以这样做:

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

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

于 2012-08-07T08:52:23.600 回答
2

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

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

// ...

echo errMsg();
于 2012-08-07T08:57:07.950 回答
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所有错误/日志消息都会整齐地显示在屏幕上。我知道这并不能直接回答您的问题,但我确实发现它非常方便,在您开始时可能值得。它肯定胜过注释掉然后取消注释可能数十条消息。您可以将这些输出留在对象中而无需担心,并让它们显示您需要的所有细节。

于 2012-08-07T09:02:59.090 回答
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 () {} 块捕获。

于 2012-08-07T09:09:18.957 回答