8

PHPドキュメントのに関するページを読んだところ、一番上に次のように書かれています。

式を定義する最も簡単で正確な方法は、「値を持つもの」です。

この単純な定義には、すべての関数とほとんどの言語構造が含まれますが、値を返さないことを明示的に示す言語構造がいくつかあります。

値を返す言語構造のリストを次に示します。

値を返さず、したがって式ではない興味深いいくつかを次に示します。

戻り値がないにもかかわらず、PHP で式として使用できるため、特に興味深いdieと思います。exit次のコード行はすべて、予想どおり構文エラーをスローします。

echo 'Hi' or echo 'Bye';

if(echo('foo'))
     return return(1);

$foo['bar'] = isset($foo['bar']) ? unset($foo['bar']) : 0;

if(unset($foo['bar']))
    __halt_compiler() or die;

ただし、次の PHP コードには構文エラーがまったくありません。

print 'Hi' or print 'Bye';    // Makes sense, print returns a value

if(!die() and exit)           // Wait what's happening here?
    quit(die(exit(quit())));  // die and exit don't have return values (does quit?)

$x = true ? die/2 : 5*exit();
$y = pow(die,7);

isset($_GET['bar']) or die(); // This one is actually pretty commonly used.

function quit(){              
    return exit;
}

PHP のドキュメントを調べたところ、die() と exit() のこの特別な扱いについての言及は見つかりませんでした。これがどこかに文書化されているかどうか、PHPの専門家は知っていますか。これは意図された動作であり、isset($_GET['bar']) or die();安全に使用できるパターンですか。PHP の将来のバージョンで突然壊れる可能性はありますか?

4

4 に答える 4

4

PHP は、コード パスに到達する実行時以外はエラーを検出しません。他の多くの言語とは異なり、ページが「コンパイル」されたときにエラーを一覧表示しないため、ソース コードのそれぞれの行が実行されるときにのみエラーが表示されます。

exitあなたの例では、 orの戻り値の評価die は決して行われません。スレッドが終了したため、PHP は最初から結果を評価しようとしなかったため、エラーを報告しません。

于 2012-05-19T16:53:36.317 に答える
3

dieそしてexit(それらはトークンを共有しT_EXITます) 構文解析フェーズ中のルールに該当しますexpr_without_variable。これが、PHP が構文エラーを発生させずにそれらを式コンテキストに含めることができる理由です。

これがどこかに文書化されているかどうか、PHPの専門家は知っていますか。

PHP のマニュアルには特別な扱いについての説明はありませんが、マニュアル ページの最初の例では、として使用されています。exit… or exit

これは意図された動作であり、isset($_GET['bar']) or die();安全に使用できるパターンですか。PHP の将来のバージョンで突然壊れる可能性はありますか?

はい。はい。どんなことでも可能ですが、可能性は低いです。

于 2012-05-19T19:09:10.500 に答える
1

と が値を返すというのは大まかな推測ですが、値が返される前に実行が停止されるため、値が返されることはdieありません。exit

dieこれは、関数と関数に「有用性」を追加するために実装された可能性がありexitます。

于 2012-05-07T02:38:49.127 に答える
1

die と exit の戻り値ですが、その値は PHP スクリプトを呼び出したプログラムで使用する必要があります。このコメントは動作を説明します。

于 2012-05-19T16:24:38.553 に答える