ホリデープログラミング入門

ホリデーにプログラミングを楽しむための入門 by 船木信宏

全体表示

[ リスト ]


プログラムは思ったとおりに動くんじゃない、書いたとおりに動くんだ

という名言があります。自分が思ったとおりには動かないことの方が多いですが、それはパソコンが悪いわけではなく残念ながら自分が書いたプログラムに問題があるわけです。今回は、動かないプログラムを動くように直す「デバッグ」の最も基本的なやり方について書いてみます。

まず何よりも、デバッグにおいては「何がわからないのかわからない」状態を脱却して「問題の原因を探す方法を知る」ことが大事だと思います。

エラーメッセージの読み方

<?php
echo "Hello World!";

入門書を開くと、たいてい最初はお約束で"Hello World"を表示するプログラムを書きます。
上記はPHPのプログラムで、今回はPHPを動かす環境はできている前提で進めます。(環境を構築する方法は以下を参照:XAMPP - 開発環境一括インストール - phpspot 後日このブログでも環境構築の話題も取り上げると思います)

ちなみに僕の環境はLinuxのFedoraCore5にApache2.2.2+PHP5.1.6、ブラウザはFirefox2.0をメインに使っています。

さて、上記2行のプログラムをhello.phpという名前で保存し、ブラウザでアクセスしてプログラムを動かしてみます。

Hello World!

とブラウザに表示されるでしょうか。表示されればプログラムは正常に、思ったとおりに動いています。
しかし、プログラムは1文字でも違えばエラーが起きます。例えば以下のようなプログラム。
<?php
ech "Hello World!";
ブラウザにはこんなメッセージが。

PHP Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in /home/funaki/work/holip/hello.php on line 2

外国語なせいもあって嫌な感じですが、踏みとどまって原因を探らねば前に進めません。
PHPのエラーメッセージは人間が読めるように書いてあるので絶対に読むべきです。

まず、

PHP Parse error:

とありますがエラーの中でも「パースエラー」という種類だ、という意味です。他にFatal errorやWarningなどがあります。どの種類にせよ、エラーが1つでもあってはダメです。

続いて

syntax error

構文が間違ってるよ、という意味。構文、というのは英語の構文あるいは文法と同じ。英語で構文がおかしければ意味が通じなくなりますしなるし、プログラムの構文に間違いがあればこのようにエラーが出ます。

unexpected T_CONSTANT_ENCAPSED_STRING

はひとまず飛ばして、

in /home/funaki/work/holip/hello.php on line 2

これはhello.phpというファイルの2行目、という意味。エラーが起きている箇所を示しています。

要約すると、hello.phpの2行目に構文のおかしいところがある、というエラーメッセージです。
これが入門書のプログラムを写しているときで、エラーが出て入門書に書いてあることと違う結果になったとしても、何か書き間違いがあるんだ、と思ってじっくり見ればechoと書くべきところがechになっていることに気付けるはずです。

改行を入れて真のエラー発生行を探る

<?php
echo "Hello World!"
続いてこんなプログラム。これもエラーが起きます。

PHP Parse error: syntax error, unexpected $end, expecting ',' or ';' in /home/funaki/work/holip/hello.php on line 3

先ほどと同じようにパースエラーで構文に問題があるらしい。しかし3行目と書いてあります。プログラムは2行しかない。
基本的にエラーメッセージに書かれる行数は正確なのですが、ことパースエラーに関しては行数を鵜呑みにしてはいけません。

3行目をじっくり見てもわからないときは、適当な箇所で改行して行数を変えてみるのが吉です。

<?php

echo "Hello World!"
PHP Parse error: syntax error, unexpected $end, expecting ',' or ';' in /home/funaki/work/holip/hello.php on line 4

ブラウザで再読み込み(リロード、F5を押す)して表示し直すと、今度は4行目になりました。ということは、先ほど改行を入れた行以降にエラーがある、と言えることがわかるでしょうか。
行数が増えなければ改行を入れた行より前にエラーがあるはずです。

改行を入れた行以降にあるプログラムは
echo "Hello World!"
しかないので、この行をじっくり見ます。ヒントはエラーメッセージの中の

unexpected $end, expecting ',' or ';'

に書いてあります。セミコロンが抜けていることに気付けるはず。行がたくさんあるプログラムになってきたら、いろいろな箇所で改行を入れてブラウザを再読み込みしてエラーの行数の変化を見る、を繰り返してエラーの原因になっている行を発見します。

日本語入力のON/OFFに注意

<?php
echo "Hello World!";
PHP Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in /home/funaki/work/holip/hello.php on line 2
このエラーはechoをechと間違えた最初のと同じです。ただ、これは知らないとすぐには気付けないかもしれません。

echoの後にあるスペースが全角スペースになっています。日本語入力をONにしてスペースを押すと出てくる記号ですが、OFFのときの半角スペースと比べると見た目には2倍長いのでよく見れば気付けます。(全角 " "、半角 " ")
PHPの構文の部分に日本語入力ONで出てくる全角の文字は基本的に使いません。誤って混入してしまうときがあるので注意です。

<?php
echo "Hello World!"; 
これなどは気づきにくい。セミコロンの後に全角スペースが入っています。

エラーメッセージを検索エンジンで調べる

よくお目にかかるエラーメッセージだけで2、30はあると思います。PHP公式のマニュアルでもエラーメッセージの網羅的な説明はありません。

しかし、同じエラーで困っている人がウェブ上に1人はいるものです。

Yahoo!検索 - PHP Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING
こんな具合にエラーメッセージで検索してみると何かしら引っかかります。参考になるページがある可能性は大いにあります。エラーメッセージを全部入れるより、ファイル名と行数の部分は削除した方がいいでしょう。

ただ、この例の場合、検索結果にあるページの多くが同じエラーが今現在出ている(!)だけでエラーの解決方法を解説しているわけではないようです。もう少しマニアックなエラーの方が、載ってます。


デバッグ術その1はこんな感じです。ちょっと長くなりましたがいかがでしょうか。「PHP デバッグ」といったキーワードで検索しても割と上級者向けのデバッグ術が多く、初歩的な解説が見当たらないので自分が今でも実践しているやり方を書いてみました。このネタは昨年末、飲み会でPHP初心の友人2人としゃべっている中で生まれました。ありがとうございます!

さて、その2では伝統的なprintデバッグと、エラーメッセージが出ないケースについて書こうと思います。

閉じる コメント(1)

顔アイコン

解決しました、ありがとうございました

2009/8/17(月) 午後 3:22 [ caroline ] 返信する

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

開く トラックバック(1)


.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事