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コードの終了にはならないので、まさかコメントの中に問題があるとは気付かず、生きているコード部分を目を皿にして確認してしまいました。