1

次のようなコードがあるとします。

<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
  die();
}
else{
  #Do something
}
?>
</body>
<html>

このコードの目的がわかりやすいことを願っています。特定の条件が満たされた場合 (つまり、データベースに接続できない場合)、プログラムは終了しますが、それ以外の場合は実行されます。die() 関数が実行されると、私の問題が発生します。その場で停止し、最初の 3 行のみをブラウザーに送信し、最後の 2 行は送信しません。

PHP チャンクの実行を停止するために、die() の代わりに使用できる関数はありますが、静的 HTML テキストは引き続き送信されますか?

4

10 に答える 10

8

プログラム ロジックをプレゼンテーションから切り離します。MVC、テンプレートについて読んでください。

最も単純な形式では、次のようになります。

<?php
function logic() {
    if (!$someCondition) {
        return 'display_empty_page';
    } else {
        return 'display_other_stuff';
    }
}

presentation(logic());



その他の場合、die()またはそのようなことが避けられない場合 (たとえば、致命的なエラーやサード パーティのコードが死んでいる場合)、出力ハンドラーに関連するハックがあります。

ob_start('myhandler'); 
function myhandler($page) {return $page.' extra markup';}
die();

ただし、診断/デバッグの目的でのみ使用することをお勧めします。

于 2008-11-20T23:58:59.870 に答える
2

ダイに静的テキストのパラメータを渡します。

たとえば、これを変更します。

<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
  die();
}
else{
  #Do something
}
?>
</body>
<html>

これに:

<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
  die("OMG RED ALERT!!!!</body></html>");
}
else{
  #Do something
}
?>
</body>
<html>
于 2008-11-21T00:14:03.770 に答える
2

ヘッダーとフッターを別々のファイルと関数に分離する必要があります。これにより、UI の保守がはるかに容易になり、ビューのレンダリングの一貫性が保たれます。それを例外処理の使用と組み合わせると、黄金になります。

<?php

printHeader(); // outputs the html header
try
{
    if (some condition)
    {
        throw new Exception("It Died...");
    }
    // More processing here that should not execute if the above condition is true
    // ...
}
catch (Exception e)
{
    echo $e->getMessage();
}
printFooter(); // outputs the html footer

?>
于 2008-11-21T00:03:28.300 に答える
1

私はおそらく例外を使用します。すべてを try / catch ブロックでラップし、データベース障害などのエラー状態で新しい例外をスローします。catch ブロックでは (空の die() メソッドのように) 何もできませんが、ここでユーザーにエラー メッセージを表示する方がよいでしょう。

PHP5 の例外処理に慣れていない場合や、PHP4 以降の変更点をブラッシュアップする必要がある場合に備えて、PHP5 の例外処理に関する非常に優れたガイドを次に示します。

于 2008-11-20T23:53:30.020 に答える
0

register_shutdown_function(php.net)を使用してページの読み込みを完了することを検討しましたか?die()とを処理できるはずexit()です。

于 2008-11-21T00:18:43.760 に答える
0

PHPのドキュメントを見ると、「exit()と同等」であることがわかります。つまり、これを呼び出すとプログラムが終了し、実際には何もする機会があまりありません。ZFの外でも、アプリケーションが死ぬときにできることはたくさんありません。解決策は、例外を使用することです。

キャッチされない例外は、基本的にdie()と同じものです(生成されるスタックトレースを除く)。例外として、try / catchブロックに配置して、エラーを修正してプログラムを続行する(またはわかりやすいエラーメッセージを表示してログを生成する)ことができます。Zend_Controller_Frontを使用している場合は、Zend Frameworkクイックスタートをチェックして、キャッチされない例外をキャッチし、適切なエラーメッセージを表示するデフォルトのエラーハンドラーを作成する方法を確認できます。

于 2008-11-21T00:53:06.513 に答える
0

PHP4 を使用している場合、または例外に煩わされたくない場合は、次の手法を使用できます。

<html>
<head><title>Title</title></head>
<body>

<?php
do {
    if (!$someCondition){
          break;
    } else {
          #Do something
    }
} while (0);
?>
</body>
<html>

.. このスタイルの使用にかなり反対しているように見える人もいますが、適切にコメントされていますが、問題はありません。各 die() ステートメントで「フッター」コードを複製するよりもはるかに優れていると思います。

于 2008-11-21T02:10:15.283 に答える
0
<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
header ("location:error_page.php?erro_message='This error occured'");

  die();
}
else{
  #Do something
}
?>
</body>
<html>

error_page.php

header
echo $_GET[$error_message];
footer
于 2013-06-24T13:50:57.823 に答える
0

機能するが、私が探しているものとはまったく異なる1つの方法は、に置き換えることdie()ですdie("</body></html>")。返されるテキストがそれよりも複雑な場合は、たとえば、変数に格納できます。これより良いものはありますか?

于 2008-11-20T23:48:54.680 に答える
0

die()ここであなたが望むものではないかもしれません。交換しない理由

if (!$someCondition) { 
    die();
} else {
    /* do stuff */
}

if ($someCondition) {
    /* do stuff */
} else {
    /* output error message/redirect/output nothing/whatever */
}

または例外をスロー/キャッチしますか?

于 2008-11-20T23:55:37.427 に答える