あなたがプログラムを理解できない10の理由:第3回
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行目」なのだ。
このように、エラーメッセージは必ずしも正確な原因を指摘してくれるわけではない。それはまるで、子供が病気になった時に「肺炎にかかりました」と報告するのではなく、「おなかが痛い」とか「だるい」などの「症状」を訴えているようなものなのだ。私たちは実生活において、こうした症状から熱を測ったりして原因を特定しようとする。スクリプトも同じように、一部を書き換えてみたり、別の場所をみたりなどの「診断」をしながら、その原因を探って病気を特定する必要がある。
そして、こればかりは、どんな「良書」といわれる入門書を読んでも、絶対に身につく技術ではない。さまざまな症状に立ち向かって、過去の経験から似たようなケースを探り出し、トライ&エラーを繰り返して身につけていくしかない。
まずは怖がらずにエラーを出していこう。エラーが出たら逃げ出さずに、しっかり考え、調べ、一つ一つ解決していこう。デバッグ作業が楽にできるようになると、スクリプトの世界はグッと楽しいものになる。それを目指してがんばっていこう。
- ホワイトペーパー



