Claude Codeにphpのコードを書いてもらっていたら、あるエラーが発生。ブラウザでアクセスすると500エラーになる。
該当ファイルのコードを見てみると、
declare(strict_types=1);
という一行がファイルの途中にある。
私は恥ずかしながらdeclareというものを今まで知らなかったので調べたところ、declare(strict_types=1)は簡単に言うと「php的な動的型付けは禁止だよ」と指示するための構文らしいです。
これはファイルの先頭、つまりphp開始カッコの直後に書かなければいけないらしい。だけど、Claude Codeが誤ってそれを先頭行以外に書いていたため、冒頭のエラーが発生していたのでした。
しかも、Claude Codeに対して「エラー発生してるから原因を調査して」と言ってるのにいつまで経ってもこのミス(declareを先頭以外に書いている)に気が付かずに、延々と違う箇所を探って見当違いなテストを続けるようにこちらに指示してきました。
そこで、「declareの位置が問題なのでは?」と指摘したところ、
おっしゃる通りです!
とのこと。
出たぁ~! AI特有の、人間をおだててミスをなかったことにする作戦!
これはChatGPTでよく見る光景ですが、まさかClaude Codeでも見ることになるとは。
また、他にも初歩レベルの凡ミスがちょいちょいあります。
たとえば、mb_send_mail関数の使い方を間違っていることがありました。mb_send_mail()は内部的にbase64エンコードしてくれるのですが、Claude Codeさんはこの仕様を理解していないようで、mb_send_mail()の前にわざわざbase64エンコードする処理を入れておりました。つまり二重エンコードされることになります。
他にも、mb_系の関数を使う時には必須の mb_language(“Japanese”) などの事前準備が抜けていたりなど。Claude Codeの思考は基本的にシングルバイト文字が前提で、マルチバイト文字の考慮はあまりしてくれません。日本語関連の学習が甘いのかな? マルチバイト文字の操作や、str系の関数を使う時は要注意です。Claude Codeに書いてもらったコードでおかしな挙動がある場合、まずはここら辺(文字列関連の関数)を疑うといいでしょう。
※注:厄介なことに、一見するとシングルバイト用の関数に見えてマルチバイトにも対応している場合があります。たとえばstr_replace()に対してmb_str_replace()は存在しません。str_replace()はバイナリセーフであり、マルチバイト文字を扱っても破綻しないようです。
Opus4.5の賢さでさえもこんな単純な凡ミスをやらかすし、しかもエラー原因を探る命令を出してもそれに気づくことも出来ない。意外だなと思うし、最新AIでもこのような初歩レベルのミスがあるのだと気をつけないといけないなと改めて思いました。
※私が使っているのは Claude Code on Desktop なので、ターミナルから利用するCLI版とは中身のバージョンが違うはずです。その点だけご留意ください。
追記
メール送信するスクリプトでずっと問題(送信されたメールの件名が途中で途切れたり、本文中にヘッダー情報が混入したり等)が続いております。1日かけてもClaude Code on desktopはこれを解決できず、延々と同じことをループして繰り返しております。デバッグが上手くない。


コメント