17

PHP では、PHP コード ブロック (つまり、PHP タグ) から抜けることはできますか?

<?php
    if (!A) phpexit();
    print("1");
?>

<?php
    print("2");
?>

したがって、Aが true の場合、結果は12になり、Afalse の場合、結果はになり2ます。

if ステートメントか何かでこれを行うことができることは知っていますが、これを行うことができる特別な PHP 関数もあるかどうかを知りたいです。

4

7 に答える 7

33

演算子がありますが、gotoこの種のトリック (「スパゲッティ コード」) を使用しないことを強くお勧めします。構造化ifブロックを使用することをお勧めします。それらに問題はありません。

を使用する前に、別の解決策gotoを検討してください。たとえば、条件に応じて異なるスクリプトを使用する場合があります。includeA

ここに画像の説明を入力

于 2013-06-16T17:15:33.677 に答える
20

次の 2 つの解決策があります。

1) ハックが少ない

ブロック内のコードを別のファイルに含めます。それらで使用returnして、インクルードファイルの処理を停止できます

//file1.php
if (!A) return;
print("1");

// file2.php
print("2");

<?php include "file1.php";?>
<?php include "file2.php";?>  

2) よりハック(他の人はおそらく私を殺すでしょう)

ブロックをdo { ... } while(false);ブロックに入れ、そこから壊す

<?php do {
    if (!A) break;
    print("1");
} while(false); ?>

<?php do {
    print("2");
} while(false); ?>
于 2013-06-16T17:24:16.707 に答える
12

いいえ、ありません。しかし、あなたができることは、各ブロックの最後にラベルを付けてから使用することgotoです (お勧めしませんが、大きなものを望まない場合if... (ps: ここでヒントとして @gd1 の回答を参照してください ;-P )))。

<?php
    if (!A) goto exit_1;
    print("1");
exit_1: ;
?>

<?php
    print("2");
exit_2: ;
?>
于 2013-06-16T17:14:12.803 に答える
8

これが実験以外の目的である場合は、間違っています。OOPの学習を開始するため、インクルード指向のプログラミングをやめます。

<?php ?>ええと...いつでも匿名関数でコンテンツをラップできます。

<?php $f = function () use (&$a) {

    if ($a)
    { 
        echo 1;
        return;
    }
    echo 2;

};$f(); ?>

<?php $f = function () {

    echo 2;

};$f(); ?>

これは PHP 5.3 以降で動作します。また、変数を共有する必要がある場合use()は、定義内のステートメントを使用してスコープにそれらを挿入できます。

しかし、繰り返しましょう:

本番コードでこのようなことをしたい場合、それは間違っています。

于 2013-06-16T18:43:24.630 に答える
6

オタクのポップ カルチャーを尊重しすぎていて、それに溶け込む必要がある (そして人気を博す!) 必要があると感じている場合は、次の方法を使用しないでgotoください。

<?php
call_user_func(function() {
    if (!A) return;
    print("1");
});
?>

<?php
    print("2");
?>
于 2013-06-16T18:03:00.820 に答える
4

いいえ、それは意味がありません。これが可能で、次のコードがあると想像してください。

<?php
    if (!A) phpexit();

    if (B) {
?>
        <b>Foo</b>
<?php
    }
?>
    <i>Baz</i>

どこにphpexit()ジャンプしますか?のthenブロックはif (B)PHP ブロックから飛び出したり入ったりしますが、<b>Foo</b>fromにジャンプしたくありませんif (!A)よね? then状態をチェックせずにブロックに飛び込むのは意味がありません。

gd1 が既に示したように、これを行うことはできますがgoto、コードが構造化されていません。コードがあちこち飛び回ると、自分自身 (および将来のコードのメンテナー) がコードの流れを理解するのが非常に難しくなります。

低レベル言語 (つまり、アセンブリ)では、操作するジャンプしかありませんが、高等言語では、if、 、などの構造でそれらを抽象化forwhileます。これらは、意図的に目的の場所にジャンプできないようにすることで、構造を提供します。

于 2013-06-16T17:24:32.157 に答える
0

エラー状態 (データベース接続エラー、無効な入力など) が原因で、残りの PHP コード ブロックをスキップする必要がある状況にいくつか遭遇しました。学生の頃、私の教授は単純に を使用してdieいました。これにより、ファイルの解析が完全に停止し、ページが不完全なままになり、フッターや HTML の終了タグさえもありません</body></html>。エラーが発生した場合でも、終了タグを切り取って無効な HTML を生成する理由はありません。

もちろん、純粋に構造化されたアプローチではifステートメントを使用しますが、これはgotoほとんどの状況でより望ましい方法です。ただし、PHP コード ブロックから飛び出そうとしているだけなら、if/構造体に大きなコード セグメントを配置するのはかなり洗練されておらず、単純に / 構造体にジャンプするステートメントをelse使用するよりも実際にコードを理解しにくくする可能性があると思います。 gotoPHP ブロックの最後 ( の直前) は、一連のコード全体が実際にはorの行?>から 50 行以上下の条件ステートメントの一部であることを思い出すのが難しくなるためです。ifelseif

gotoステートメントは良くないと誰もが言いますgotoが、コードを理解しやすくするための有効な使用法があります。たとえば、深くネストされた制御構造から飛び出したり、PHP コード ブロックの最後にジャンプしたりします (組み込みの言語構造が存在しない場合)。それを行うため)。

のようなコード構造gotoは本質的に悪ではありません。それはあなたがそれをどのように使用するかにかかっています。

于 2013-10-29T00:32:44.770 に答える