PHPのgoto文とは?基本構文・使い方・制限事項まで徹底解説
はじめに
PHPのgoto文は、プログラムの処理の流れをコード内の任意の場所へ移動(ジャンプ)させるために使用されます。移動先は、開発者が自由に定義できる「ラベル」で指定します。実務では、if文やelse、switch構文のcaseといった条件式の一部として、goto文が記述されるケースが一般的です。
基本構文
statement1; statement2; if (expression) goto label1; statement3; label1: statement4;
statement2の後にif文の条件式がtrueと評価された場合、プログラムの流れはlabel1へジャンプし、statement4が実行されます。逆に条件式がfalseの場合は、statement3がそのまま実行され、以降は通常どおり処理が続行されます。
次の例では、ユーザーが入力した数値が偶数であれば、指定したラベルへジャンプするようにしています。
サンプルコード:条件分岐とgoto文の組み合わせ
<?php
$x=(int)readline("enter a number");
if ($x%2==0)
goto abc;
echo "x is an odd number";
return;
abc:
echo "x is an even number";
?>出力結果
このコードを実行すると、次のような結果が出力されます。
x is an even number
goto文でループを作る
gotoキーワードに対するラベルは、現在のステートメントより前にも後にも配置できます。特に、goto文のラベルがそれ以前のステートメントを指している場合、処理が繰り返されることになり、これはループとして機能します。
次の例は、goto文だけで構成したシンプルなループです。
サンプルコード
<?php $x=0; start: $x++; echo "x=$x\n"; if ($x<5) goto start; ?>
出力結果
このコードを実行すると、次のような結果が出力されます。
x=1 x=2 x=3 x=4 x=5
このように、変数$xが5未満である間は「start」ラベルへ戻り続けるため、for文やwhile文を使わなくても反復処理が実現できます。
ループ内部へのジャンプは禁止されている
goto文を使えば、プログラムの制御を任意の名前付きラベルへジャンプさせることができます。しかし、その移動先には重要な制約があり、ループやswitch構文の途中へジャンプすることは許可されていません。これに違反すると、致命的なエラー(Fatal error)が発生します。
サンプルコード(エラーになる例)
<?php
for ($x=1; $x<=5; $x++){
if (x==3)
goto inloop;
for ($y=1;$y<=5; $y++){
inloop:
echo "x=$x y=$y\n";
}
}
?>出力結果
このコードを実行すると、次のエラーが出力されます。
PHP Fatal error: 'goto' into loop or switch statement is disallowed in line 5
まとめ
PHPのgoto文は、ラベルを指定してプログラムの流れを自由に移動できる強力な仕組みですが、乱用するとコードの可読性や保守性が大きく低下します。実際、現代のPHP開発では、goto文よりもif文・for文・while文などの構造化された制御構文を使用することが推奨されています。goto文はあくまで特殊なケース向けの機能として理解しておきましょう。
-
PHPのbreakステートメントとは?ループとswitchを抜ける方法を実例で解説
はじめにbreakステートメントは、PHPにおけるループ制御のためのキーワードのひとつです。while、do-while、for、foreachといったループ処理やswitch文の中でプログラムの流れがbreakに到達すると、そのループ(またはswitchブロック)内の残りの処理はすべてスキップされ、ループの直後にある処理へと実行が移ります。基本構文while (expr) { .. .. if (expr1) &n
-
HTMLをPHPの「if」文の中に埋め込む方法をわかりやすく解説
はい、PHPを使えばHTMLを「if」文の中に埋め込むことができます。条件分岐の結果に応じて異なるHTMLを出力したい場面は非常に多く、そのためにいくつかの書き方が用意されています。ここでは代表的な3つの方法を紹介します。 方法1:代替構文(if〜endif)を使う PHPには、コロン「:」と「endif;」を組み合わせた代替構文があります。波括弧「{}」を使わないため、PHPとHTMLが混在するテンプレートでは特に読みやすくなります。 <?php if($condition) : ?> <a href="http