変数には下記の状態があると思いますが
1. 一度も使われていない未定義な状態
2. nullが代入されている状態
3. null以外の値が入っている状態
1だけを見分けるスマートな方法を探しています。
issetを使うと3かどうかを判別するだけですし、is_nullを使うと1の状態の時にNoticeを吐いてしまいますし、そもそも自動的に型変換が行われて未定義だったはずがnullがセットされて1と2が両方共trueになってしまいます。
どうにかして、1の状態であるかどうかを、なるべく短いコード(頻繁に使うので)でかつ余計なエラーなどを吐かずに取得する方法はないものかと困っています。
何か手段があればお教えいただけますでしょうか。
コメントをありがとうございます。
回答を訂正しました。
issetを正しく理解する。null値とunsetの違い-PHP変数管理(http://www.cpa-lab.com/tech/097)に書いてあるように、PHPでは未定義とNULL代入の区別が難しいので、次のようなコードが最も短い形になると思います。
結果は変数$_is_nodefineに、未定義ならTRUEが、それ以外ならFALSEが入ります。
PHPの性質上、この処理を関数やクラスにすることができません。
<?php function _myErrorHandler($errno, $errmsg, $filename, $linenum, $vars) { global $_is_nodefine; if ($errno | E_WARNING) $_is_nodefine = TRUE; } //$a = NULL; //$a = '1'; $old_error_reporting = error_reporting(E_ALL); $_is_nodefine = FALSE; $old_error_handler = set_error_handler('_myErrorHandler'); is_null($a); if (! is_null($old_error_handler)) set_error_handler($old_error_handler); error_reporting($old_error_reporting); var_dump($_is_nodefine); ?>
コメントをありがとうございます。
2012/08/13 15:24:53回答を訂正しました。
詳しいご回答ありがとう御座います!
2012/08/13 15:38:22エラーの発生の有無で見分ける必要があるのですね、これはなかなか大変です・・
簡易的に行う方法はなさそうなので、どうしても必要という状況出ない限り代替手段を探したほうがよさそうです。
大変参考になりました、ありがとう御座います