読者です 読者をやめる 読者になる 読者になる

uzullaがブログ

uzullaがブログです。

エラーを無視しがちなPHPで安心ガードする、または「require strict;」

php

イケプロ*1が禁忌する言語PHP!!(挨拶)

イケピチ*2のuzullaです。今年は休み長いですね!!最高!!(仕事しながら)


その理由の一つとして、カジュアルにエラーを無視して進み続ける所ですよね。


<?php
echo $a; // 未定義変数
echo "I wanna die";


たとえばこのような未定義変数の参照。
これはE_NOTICEレベルのエラーが出ますが(出ない設定もあるが)、あくまでnoticeなので無視して先に進みます。


一般的なプログラマからは「ハァ?変数無いとかどう考えてもFATALだろ…笑顔でNOTICEって何事。これだから宣言無しのPHPは…」って言われますね。

実際自分もそう思う、なんでこれでとまらないのかな、とめられないのかな、俺がアホなのかな*3

つーか、そもそもNOTICEはちょっと前のデフォルトだと出ないですね*4

NO MORE NOTICE

「E_ALL & ~E_NOTICE」 を取り戻せという意味ではない。

E_NOTICEはやっぱエラーだし、消すべき。


真面目な話、NOTICEの無視は本当にバグの温床になりますし、本当に本当に本当に放置されすぎですね。
display_erorrs=off の本番サーバーで開発&チェックしてる(検閲削除)NOTICEエラーでログが埋まっていてヤバい。

画面に出ないから気付いてないんだろうけど、他の人は見て失笑してるぞ!!

一方ラクダの国では

Perlなら

use strict;
use warnings;

一発(?)で、わりと簡単便利に安全安心になりますが、しかしphpはそんな簡単なのなかった。


PHPにもuse strict;ほしい!

オチ

!注意!以下のコードを理解せずコピペしてつかってはいけません!!

「なんでや、コピペしたらあかんのか?」という方は是非以下の丁寧に解説されたエントリをご覧ください。
http://d.hatena.ne.jp/anatoo/20140106/1388959860

<?php
// strict error bailout
function strict_error_handler($errno, $errstr, $errfile, $errline)
{
    die ("STRICT: {$errno} {$errstr} {$errfile} {$errline} ".PHP_EOL);
}
set_error_handler("strict_error_handler");

echo $a; // 未定義変数
echo "I will die";

このように先頭の方で書く事で、どんなエラーでも死ぬ。

E_NOTICEでも、勿論E_WARNINGでも、仮にE_STRICTでも。さらにはE_DEPRECATEDでも!強制的に死ぬ。小石で転んで死ぬ。

「お役立ち!!必ず入れろ!!」系お役立ち情報ではない。

まあ個人的には必ず停止させる方が便利だとおもいますけどね。

重量級WAFとかデカイライブラリいれてたり、100年前から続く秘伝のタレがはいってると、食い合わせが悪くて死ぬ可能性もある*5

コードを読まない人がかいたら詰むぞ。
(そもそも上の例は、画面に出しちゃってるからそのまま使わないとおもいますが、それも読んでない人がいたら面白い)

昨日のエントリみたいな、pファイルを操作するからちょっとした異常でも絶対に変な感じで進んで欲しくない」系のツールやバッチみたいな、「オイ、これ何年前のPerlだよ」みたいなCLIプログラムを書く時には必ずいれてもいい有用さですね。
http://uzulla.hateblo.jp/entry/2014/01/03/040355


あと、よくわかんない所から(略)みたいなコードがでてきたとき、最低限の文法を合わせる程度の意味合いで、矯正ギプスとしていれさせるのもm(略(最後外すにせよ)

繰り返しになりますけど

「E_NOTICEはエラー「エラー「エラー」(残響音含む)

「display_errorをOffるからいいよ」って言ってたあの開発会社に、エラーログ全部メールで送りつづけたい

後、「E_DEPRECATEDも消さなきゃダメだから」って言ったら、「こうやればきえるよ!」って「& ~E_DEPRECATED」付け足奴〜。

そうじゃない、そうじゃないんだ…*6


短いですが、こちらからは以上です。

*1:イケてるヤバイプログラマ

*2:イケてなくてヤバイピチパー

*3:そもそもエラーにしない思想なら、それはそれでよいが、NOTICE出すならとめるべきでは…

*4:E_ALLじゃない設定、実際多いですね

*5:まあ、いうてもset_error_handlerしてるようなのはめったにお目にかかりませんが

*6:5.1.6を後何年使う気なんだ?