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を使用するには、返されるすべてのhtmlをvarに割り当てる必要があります。そのためには、htmlを文字列に入れる必要があります。2行を超えるhtmlを文字列に入れるのは避けたいと思います。そうするために必要な引用符の数が多いためです。

したがって、ヒアドキュメント構文またはob_start/ob_get_clean関数のいずれかを使用することを考えています。私が知りたいのはです。

1このようにコードを抽象化する必要さえありますか?
2もしそうなら、それを行うためのベストプラクティスの方法はどちらですか?および/または
3Web開発をあきらめて、ピザの配達に戻る必要がありますか?:-\

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キャッチされなかったエラーメッセージをエラーハンドラーに転送し、エラーハンドラーは独自のビューを使用しますエラーをレンダリングします。

またはフレームワーク付き:

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 に答える