5

以下のコードで「予期しない T_ELSE」構文エラーが発生する理由を知りたいだけです。

<?php if (isset($_SESSION["user_id"])) { ?>
            <h2>Welcome, <?php echo $_SESSION["user_id"]; ?></h2>
<?php } ?>
<?php else { ?>
    <form action="" method="post">
        <label for="user">User ID</label>
        <input type="text" id="user" />
        <label for="password">Password</label>
        <input type="password" id="password" />
        <input type="submit" value="Login" />
    </form>
<?php } ?>

} else { を同じ行に保持している間、正常に動作します。以下のコードは問題なく動作します。

<?php if (isset($_SESSION["user_id"])) { ?>
            <h2>Welcome, <?php echo $_SESSION["user_id"]; ?></h2>
<?php } else { ?>
    <form action="" method="post">
        <label for="user">User ID</label>
        <input type="text" id="user" />
        <label for="password">Password</label>
        <input type="password" id="password" />
        <input type="submit" value="Login" />
    </form>
<?php } ?>
4

4 に答える 4

1

これについて少し考えてみると、これは意図した動作でなければならないことに気づきました。

次の (構文が間違っている) 例を検討してください。

<?php if ($condition == true) { ?>
  <div id="first">Yey</div>
<?php } ?>
<span id="second?">where am I?</span>
<?php else { ?>
  <div id="first">Ney</div>
<?php } ?>

span 要素が未定義の状態になる

于 2013-07-10T10:46:12.503 に答える
1

それ自体は何も変ではありません。それは、別のコード ブロックにいるためです。これが最も簡単な言い方です。「PHPを離れる」時点では何も開いていないため、戻ったときにコンテキストはありません。

コードを次のように考えてください (もちろん、要点を強調するためだけに疑似コードと考えてください)。

if (isset($_SESSION["user_id"])) {
    // ....
}; else {
    // ....
}

PHP の侵入/切断は、時には注意が必要な場合があり、最初の例のように PHP を管理することはあまり意味がありません。

これを使用することを検討することをお勧めします。これにより、elseブロックへの遷移が 1 行にまとめられます。

<?php if (isset($_SESSION["user_id"])): ?>
    <h2>Welcome, <?php echo $_SESSION["user_id"]; ?></h2>
<?php else: ?>
    <form action="" method="post">
        <label for="user">User ID</label>
        <input type="text" id="user" />
        <label for="password">Password</label>
        <input type="password" id="password" />
        <input type="submit" value="Login" />
    </form>
<?php endif ?>

結局のところ、PHP は非常に柔軟ですが、やりたいことができるとは思えません。これにより、else何マイルも離れた場所にブロックを追加できるようになりますが、これはまったく意図していない可能性があります。

于 2013-07-10T10:21:31.350 に答える
1

else前に . がないステートメントで新しいコード ブロックを開始できないようですif

あなたは…</p>

A)コードを1つのブロックに記述します。たとえば、

<?php }
else { ?>

B) または、複数のコード ブロックを使用している場合は、別の構文を使用します。

<?php if (isset($_SESSION["user_id"])): ?>
    /* … */
<?php else: ?>
    /* … */
<?php endif; ?>
于 2013-07-10T10:22:58.493 に答える
1
<?php } ?>
        ^^

PHP がファイルを解析するとき、開始タグと終了タグを探します。これらのタグは、PHP にそれらの間のコードの解釈を開始および停止するように指示します。この方法で解析すると、PHP パーサーは開始タグと終了タグのペアの外側にあるものはすべて無視するため、あらゆる種類の異なるドキュメントに PHP を埋め込むことができます。

PHP パーサーがこの行に到達すると、if ブロックのみが実行されます。その後、PHP パーサーはコードの次のブロック ( else part ) を解析しようとしましたが、ここでは and で開始されelse {たため、else分離されifてエラーが発生します。

于 2013-07-10T10:23:13.743 に答える