コメントが原因でPHPがエラーになった件

2019年4月17日By 西村Web制作

simplu27によるPixabayからの画像

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