[PHP]goto文を使用すると「syntax error, unexpected T_STRING」エラーが発生

PHPでgoto文を使用したプログラムを書いていたのですが、手元の開発環境だと動作するのに、サーバにアップロードすると以下のエラーが発生するという問題が発生しました。

Parse error: syntax error, unexpected T_STRING in ...




手元の環境だと動くという事は、環境の問題なので、まずはphpinfo()でバージョンを確認してみます。

開発環境

PHP Version 5.3.1
System  Windows NT 5.1 build 2600 (Windows XP Professional Service Pack 3) i586



本番環境

PHP Version 5.2.17
System  Linux 2.6.18-308.11.1.el5PAE #1 SMP Tue Jul 10 09:29:33 EDT 2012 i686




PHPのオンラインマニュアルで確認したところ,そのものずばりの答えがありました。
gotoがサポートされたのはバージョン5.3以降だそうです。

http://php.net/manual/en/control-structures.goto.php より


goto 演算子を使用すると、 プログラム中の他の命令にジャンプすることができます。 ジャンプ先はラベルとコロンで表し、 goto の後にそのラベルを指定します。 これは、完全に制約のない goto というわけではありません。 対象となるラベルは同じファイル上の同じコンテキストになければなりません。 つまり、関数やメソッドの外に飛び出したり 関数やメソッドの中に突入したりすることはできないということです。 また、いかなるループや switch 構造の中にも突入することができません。 逆にループや switch 構造から抜け出すことはできます。一般的な用法としては、 goto を複数レベルの break として使うものがあります。



マニュアルにもあるように、PHPのgotoはC言語などと比べて制限があり、多重ループの抜け出しなどの特定の状況でしか使えません。

例えば以下のコードはエラーになるそうです。

<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    loop:
  }
}
echo "$i = $i";
?>




一般に”gotoは悪”と言われてますが、個人的には共通の終了処理有りのガード節を書く時に良く使うので、goto禁止はちょっと不便です…。 try-finallyで代替しようにも、PHPにはfinallyが無いし困ったもんだ。

関連記事

コメントを残す

メールアドレスが公開されることはありません。