所以我早些时候问了一个类似的问题,现在我只是更加困惑,所以我会以不同的方式问这个问题......
我正在尝试做的是抽象我的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我应该放弃网络开发并回到披萨送货上吗? : - \
答案 0 :(得分:4)
我不会返回任何HTML。只需从函数返回错误消息,然后在更合适的位置构建html。例如模板内部。
答案 1 :(得分: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 () {}
块捕获。