やったことだけ書く備忘録

PHP5.4からは即時stdClass生成がWarningエラーを吐くようになった話

短いですが、メモ程度に書いておきます。

2013/06/06 Codeigniterのエラー処理について追記しました



かなり前からCodeIgniterで、stdClassを即時生成してプロパティを生やすコードを書いてました。



$data
->hoge 'huga';

$this->load->view('view'$data);
 

みたいなコードです。誰かのコードを参考にした記憶があるんですが、まぁそれはいいとして。
CIを使ってる方なら同じような書き方をしてるかもしれません。あ、してないならいいですすいません。


PHP5.3はStrictエラー


これが通用するのはPHP5.2までなんですね。PHP5.3からはStrict Errorの警告が出ます。



# PHP5.3.21
$data->hoge 'huga';

=> 
PHP Strict Standards:  Creating default object from empty value
 


まぁStrict違反だしまぁいいかー…と思ってたんですが(いや、エラーは無い方がいいんですけどね)



[追記]



「いや、そもそもPHP5.3.xで気付かない方がおかしくない?」と思われた方もいるかもしれません。実は、CodeIgniter上でコーディングしている場合はこのエラーは出ないのです。だから気が付かなかった。

CodeIgniterは、独自のエラーハンドラー内でStrictエラーをもみ消すという処理を行なっています。(もみ消す、という表現が正しいかはさておき)私の手元のCI2.1.3でも確認できました。具体的には、system/core/Common.phpの_exception_hanlder()関数の中です。




if ( ! function_exists('_exception_handler'))
{
        function 
_exception_handler($severity$message$filepath$line)
        {
                 
// We don't bother with "strict" notices since they tend to fill up
                 // the log file with excess information that isn't normally very helpful.
                 // For example, if you are running PHP 5 and you use version 4 style
                 // class functions (without prefixes like "public", "private", etc.)
                 // you'll get notices telling you that these have been deprecated.
                
if ($severity == E_STRICT)
                {
                        return;
                }

                
$_error =& load_class('Exceptions''core');

                
// Should we display the error? We'll get the current error_reporting
                // level and add its bits with the severity bits to find out.
                
if (($severity error_reporting()) == $severity)
                {
                        
$_error->show_php_error($severity$message$filepath$line);
                }

                
// Should we log the error?  No?  We're done...
                
if (config_item('log_threshold') == 0)
                {
                        return;
                }

                
$_error->log_exception($severity$message$filepath$line);
        }
}
 


ということで、$severtyにはエラーレベルが入りますが、それがE_STRICTの場合はreturnしてエラーを吐かずに握りつぶしているようです。個人的にはFWがそこまで面倒見るよりは、ダメなものはダメって警告は出してくれる方がいいような気もしますが…

とまぁ、そんなわけでCodeIgniter上ではStrictエラーは表示されないようになっているので、他のFWで途端にエラーが出たりするかもしれません。エラーのでないコードを心がけたいですね(自戒)



PHP5.4からはWarningエラー


なんとPHP5.4からはエラーレベルがWarningまで上がってるんですねー(;´Д`)



# PHP5.4.11
$data->hoge 'huga';

=> 
PHP Warning:  Creating default object from empty value
 

さすがにWarningだとerror_reportingで消すのも憚られるレベルなので、ちゃんとstdClassで初期化しなさいよ、という話でした。




# PHP5.4.11
$data = new stdClass;
$data->hoge 'huga';

=> ( 
´∀`)b
 


これならOKですね。あ、顔文字は出ませんけど。

« 前の記事 次の記事 »

7件のコメント

Open さん

Grade A stuff. I'm untulsqionabey in your debt.

Heejin さん

I hate my life but at least this makes it <a href="http://vlvlxowel.com">bearebla.</a>

xeajipoyoro さん

http://without-prescription-buyretin-a.net/ - without-prescription-buyretin-a.net.ankor <a href="http://doxycycline100mgbuy.com/">doxycycline100mgbuy.com.ankor</a> http://cialistadalafillowest-price.net/

woquuna さん

http://without-prescription-buyretin-a.net/ - without-prescription-buyretin-a.net.ankor <a href="http://doxycycline100mgbuy.com/">doxycycline100mgbuy.com.ankor</a> http://cialistadalafillowest-price.net/

uokuyitaug さん

http://without-prescription-buyretin-a.net/ - without-prescription-buyretin-a.net.ankor <a href="http://doxycycline100mgbuy.com/">doxycycline100mgbuy.com.ankor</a> http://cialistadalafillowest-price.net/

uyuvaepo さん

http://without-prescription-buyretin-a.net/ - without-prescription-buyretin-a.net.ankor <a href="http://doxycycline100mgbuy.com/">doxycycline100mgbuy.com.ankor</a> http://cialistadalafillowest-price.net/

ivufabafos さん

[url=http://without-prescription-buyretin-a.net/]without-prescription-buyretin-a.net.ankor[/url] <a href="http://doxycycline100mgbuy.com/">doxycycline100mgbuy.com.ankor</a> http://cialistadalafillowest-price.net/

コメントを投稿する

 画像に表示されている文字を入力してください。