波括弧 } の閉じ忘れによる Parse error: Unclosed '{'
関数やif文の波括弧を閉じ忘れると、PHPはファイルの終わりに達してから、どの行の { が対応を失っているかを教えてくれます。
エラーメッセージの読み方
Parse error: Unclosed '{' on line 2 in main.php on line 5
main.php- ファイル名
5- 行番号 — PHPが構文解析を諦めた位置
Parse error- エラー種別 — 実行前の構文チェックで検出されました
Unclosed '{' on line 2- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 <?php 2 function total($a, $b) { 3 return $a + $b; 4 ^ 5 echo total(1, 2);
total関数を閉じる波括弧がありません。PHPはファイルの終わりに達してから、2行目の { が対応を失っていることを教えてくれます。
直し方: (空) を } にします。
パターン2
1 <?php 2 if (true) { 3 echo "yes"; 4 ^ 5 echo "done";
if文の波括弧も同様です。閉じ忘れると、以降のコードがすべてif文の中に取り込まれたままファイル末尾に達してしまいます。
直し方: (空) を } にします。
パターン3
1 <?php 2 function greet($name) { 3 echo "Hi " . $name; 4 ^ 5 greet("Al");
greet関数の閉じ波括弧が必要です。「Unclosed '{' on line 2」の2行目こそが本当の原因の行です。
直し方: (空) を } にします。
パターン4
1 <?php 2 function multiply($a, $b) { 3 return $a * $b; 4 ^ 5 echo multiply(2, 3);
multiply関数を閉じる波括弧がありません。ファイル末尾に達してから2行目の{が対応を失っていることが分かります。
直し方: (空) を } にします。
パターン5
1 <?php 2 while (false) { 3 echo "never"; 4 ^ 5 echo "after";
while文の波括弧も同様です。閉じ忘れると以降のコードが全てその中に取り込まれたままになります。
直し方: (空) を } にします。
よくある誤解
エラーメッセージには2つの行番号が出ます。「on line 6」はPHPが諦めた場所、「Unclosed '{' on line 2」が本当の原因の行です。後者を直す必要があります。
実務での勘所
波括弧の対応崩れそのものを避ける手段として、PHPはif (...): ... endif;やforeach (...): ... endforeach;のような、コロンと対応する終了キーワードを使う別の構文を用意しています。この書き方はHTMLとPHPが混在するテンプレートファイルで特によく使われ、閉じ波括弧の代わりに名前の付いた終了キーワード(endif、endforeachなど)を探せばよいため、深くネストしたテンプレートでも対応関係を見失いにくくなります。