あなたがプログラムを理解できない10の理由:第3回

たにぐちまこと(H2O Space.)
2008-05-20 14:39:01
初学者がプログラムを恐れる原因の一つにエラーメッセージがある。今回は「エラーメッセージを見ると思考が止まる」と、「良いツールを整えようとしない」を解消しよう。
最新特集【一覧】
Fatal error: Call to undefined function mb_convert_encording() in sample01.php on line 2

 まずは日本語に訳してみよう。ここではGoogle翻訳にかけてみた。結果は次の通りだ。

致命的なエラー:未定義の関数呼び出しをmb_convert_encording()が指定さsample01.phpを2行目

 正確な翻訳ではない上、「致命的」とか「未定義」など難解な言葉が使われているが、要するに「mb_convert_encording()」などというファンクション(機能)はないといっている訳だ。では、いったいどうしたらよいだろう。

 ここで、若干難しいのは「エラーメッセージを鵜呑みにしてはいけない」ということ。ファンクションが存在しないからといって、入門書に記述されていたプログラムを打ち込んでいるだけなのに、「そんな機能はない」などといわれても困ってしまう。そんな時は、少し発想を変えてみよう。「見つからない」ということは、次の2つの原因が考えられる。

  • 実際にそのような機能が存在しない
  • 似たような名前の機能は存在しているのだが、言い間違い(スペルミス)をしている

 実は、このエラーの原因は後者だ。PHPには「mb_convert_encoding」というファンクションこそ存在するが、ここでは「enco”r”ding」と、余計な「r」を入れてしまったためにスペルミスを犯しているのだ。

 PHPにはスペルミスであることは分からないため、このようなエラーメッセージとなってしまうのである。

 次のエラーを見てみよう。

Parse error: syntax error, unexpected T_PRINT in sample01.php on line 3

 Google翻訳にかけてみる。

解析エラー:構文エラーが発生すると、予期しない子T_PRINT sample01.php上で3行目

 どうやら「print」という記述がPHPの予想していない場所に出現したと言われているようだ。これはかなりややこしい。では、このエラーが出たスクリプトを見てみよう。


 10と5を加えた答えを画面に表示すると言うだけのスクリプトである。いったいどこが間違えているのか分かるだろうか?

 先に答えを言うと、実は2行目の「10+5」の後に「;(セミコロン)」がないのだ。たったこれだけのことで先のような大げさなエラーメッセージが表示されてしまう。

 この場合、エラーメッセージを鵜呑みにしてしまうと混乱に陥る。「print」という記述が「予期しない」などといわれているが、printというファンクションは間違いないし、スペルミスもしていない。さらに「3行目」などといわれているが、実際に間違えているのは、実は「2行目」なのだ。

 このように、エラーメッセージは必ずしも正確な原因を指摘してくれるわけではない。それはまるで、子供が病気になった時に「肺炎にかかりました」と報告するのではなく、「おなかが痛い」とか「だるい」などの「症状」を訴えているようなものなのだ。私たちは実生活において、こうした症状から熱を測ったりして原因を特定しようとする。スクリプトも同じように、一部を書き換えてみたり、別の場所をみたりなどの「診断」をしながら、その原因を探って病気を特定する必要がある。

 そして、こればかりは、どんな「良書」といわれる入門書を読んでも、絶対に身につく技術ではない。さまざまな症状に立ち向かって、過去の経験から似たようなケースを探り出し、トライ&エラーを繰り返して身につけていくしかない。

 まずは怖がらずにエラーを出していこう。エラーが出たら逃げ出さずに、しっかり考え、調べ、一つ一つ解決していこう。デバッグ作業が楽にできるようになると、スクリプトの世界はグッと楽しいものになる。それを目指してがんばっていこう。