2020.02.09 英語版松本広域マップ制作 2020.01.13 温泉施設"ホットプラザ浅間"HP制作・撮影・TripAdvisor/LINE等登録 2020.01.04 オルゴール博物館「すわのね」のホームページ制作 2019.12.21 製造業のホームページ新規制作と撮影・年末年始の休業 2019.11.16 浅間温泉にイルミネーション設置 2019.10.03 安曇野のバスの GTFS へのデータ登録を弊社で行いました 2019.09.23 Credit Card払い&スマホ決済対応開始 2019.08.29 英語のNative Speakerの正社員(翻訳・Web/パンフ制作)募集 2019.08.07 外国人日本文化体験デー@中町 2019.06.22 2020東京オリンピック関連の翻訳 2019.06.16 安曇野「田んぼアート」イベントHP制作 2019.06.06 善光寺の日本語・英語お朝事パンフレット 2019.04.28 GW10連休中の対応・イベントカレンダー 2019.04.17 コメントが原因でPHPがエラーになった件 WordPressなどでPHPのコードを書き間違えると、画面が真っ白になったり、サーバーエラーになってしまいます。
先日もPHPが構文エラーになってハマってしまいました。自分の書いたコードをざっと見ても原因がわからない場合、PHP Code Checkerというサイトを利用しています。
このサイトに問題のコードをコピーペーストして、いくつかの行を削除するなど、原因を調べていくと、なぜかコメント行があると構文エラーになることがわかりました。ネストしたC言語型コメント
PHP言語では3種類のコメント記法がサポートされています。
C言語と同じ/*と*/で囲む形式、C++言語と同じ//で始まる形式、Unixシェル言語と同じ#で始まる形式です。コメントが原因でエラーになる例として、よく挙げられるのは、C言語型コメントをネストさせてしまう失敗です。
<?php /* if ( $foo ) { echo $bar; /* ネストしたコメント */ } */ ?>
上の例では、緑色の閉じ括弧はコメントの外になって余ってしまい、エラーになります。
文字列中の */
また、検索や置換に便利な正規表現など、文字列の中にある
*/が原因のこともあります。
C言語型コメントでは、/*の後、最初の*/までがコメント範囲で、文字列の中かどうかまでは判別しません。<?php /* if ( $foo ) { preg_match( '/\d+(?:-\d+)*/', $bar, $match ); } */ ?>
上の例では、文字列の終わりのつもりだった
'が文字列の始まりとして扱われ、閉じていない文字列になってしまいます。文字列中の ?>
今回ハマったのはC++言語型コメントで、やはり正規表現の中が問題でした。
?>を含んでいたのです。
C++言語型やシェル型コメントは、通常改行までの範囲がコメントになりますが、?>がある場合は、ここでPHPコードが終了し、コメントも終わりになります。この場合も?>が文字列の中にあるかどうかまでは判別してくれません。<?php if ( $foo ) { // $bar = preg_replace( '#<br\s*/?>#', '', $bar ); } ?>
上の例では、閉じ括弧はPHPコードの外にあることになり、閉じ括弧が見つからないエラーになります。
コメントでなければ文字列中の
?>はPHPコードの終了にはならないので、まさかコメントの中に問題があるとは気付かず、生きているコード部分を目を皿にして確認してしまいました。