所以我之前问过一个类似的问题,现在我只是更困惑了,所以我会用不同的方式问它......
我正在尝试做的是抽象我的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。例如模板内部。
- 是的,当然,你做事的方式没有灵活性。
- 理想情况下,您应该将所有 HTML 与 PHP 分开,至少是函数 - 唯一可以远程接受的地方是在使用 PHP 仅显示函数输出的视图中。
- 比萨饼!开个玩笑,但披萨永远不够!?
看看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 () {}
块中。