PHPでのgoto文の使い方と2つの制約

goto文はあるラベルに飛ぶために使われる構文のこと

PHPでもバージョン5.3.0以降でgoto文は使えるようになりました。

ただし自由自在にどこでも飛べるわけではなく、いくつか制約もあります。

そういう訳でPHPでのgotoの使い方と制約について詳しく紹介

goto文の基本的な使い方

gotoの使い方は他の言語で知っている人なら分かると思います。

ラベル label  を定義したなら goto label;  でその場所まで飛ぶだけ

ラベルの場所は goto  の前でも後にあっても構いません。

 

goto文の具体的な使い方ですが、分かりやすいのが次のコード例

こういう風に3重以上の深いループを一気に抜けるときに便利です。

ただ当然これはgotoを使わなくても書けるし、gotoの多用はあまりよくありません。

なので多重ループなどどうしても使う必要のある場面だけで使うのが安全

 

そしてこのgoto文ですがラベルのある場所なら自由自在に飛べるわけではありません。

PHPではコードの可読性を保つためにある2つの制約があります。

PHPでのgoto文の2つの制約

その2つの制約とは次のようなこと

  • 関数やメソッドの外には飛べない
  • ループやswitchのなかにラベルは置けない

この2つの制約についてコード例と一緒に説明したいと思います。

関数やメソッドの外には飛べない

まず1つめは関数やメソッド内でgotoする場合、

  • 外側に置いたラベルにジャンプ
  • 別の関数やメソッドにジャンプ

などのように関数やメソッドの外には飛ぶことは不可です。

 

例えば次のように関数内でその外のラベルに飛ぶのはNG

このコードを実行すると次のようなエラーメッセージが出て怒られてしまいます。

関数外のラベルは undefined  になるようですね。

 

また当然次のように他の関数やメソッドに飛ぶのもNG

こちらも次のようなエラーメッセージが出てしまいます。

 

ということでラベルを関数やメソッド内に書く場合はその範囲内でしか使えないことに注意

まあどこにでも飛べてしまうと悪質なコードになるので当然と言えば当然ですね。

ループやswitchのなかにラベルは置けない

もう1つの制約はループやswitch文の中にラベルは置けないということ

つまりいきなりgotoを使ってループやswitch内に突入することはできないという意味です。

 

例えば次のようにforループ内にgotoするのはNG

これを実行すると次のようなエラーメッセージが表示されます。

for  に限らず foreach  や while  内にも当然ラベルを置いてはいけません。

 

また次のようにswitch内にジャンプしてしまうのもNG

 

このようにループやswitch内にジャンプすることができない点にも注意

ただしif文などループが絡まないステートメントには問題なくジャンプ可能です。

ここまでのまとめ

ということでPHPのgoto文のまとめ

  • 任意のラベルに飛ぶ構文
    ラベル label  があるとすると goto label;  でその場所まで飛べる
  • ただし2つの制約あり
    1つめ : 関数やメソッドで goto  するときはその外に飛ぶことができない
    2つめ : ループやswitch内にラベルを置いてジャンプすることも不可

ほとんどgotoを使う機会はないですが、もし使う必要があるなら2つの制約に注意です、

以上PHPでのgoto文の使い方と制約についてでした。

ではでは($・・)/~~~

PHP

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください