phpで変数が未定義かnullか値が入っているかを見分ける方法について質問です。


変数には下記の状態があると思いますが
1. 一度も使われていない未定義な状態
2. nullが代入されている状態
3. null以外の値が入っている状態

1だけを見分けるスマートな方法を探しています。
issetを使うと3かどうかを判別するだけですし、is_nullを使うと1の状態の時にNoticeを吐いてしまいますし、そもそも自動的に型変換が行われて未定義だったはずがnullがセットされて1と2が両方共trueになってしまいます。

どうにかして、1の状態であるかどうかを、なるべく短いコード(頻繁に使うので)でかつ余計なエラーなどを吐かずに取得する方法はないものかと困っています。
何か手段があればお教えいただけますでしょうか。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/08/13 15:38:34
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:oil999 No.1

回答回数1728ベストアンサー獲得回数320

ポイント200pt

コメントをありがとうございます。
回答を訂正しました。

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);
?>
他1件のコメントを見る
id:oil999

コメントをありがとうございます。
回答を訂正しました。

2012/08/13 15:24:53
id:n_maco2

詳しいご回答ありがとう御座います!
エラーの発生の有無で見分ける必要があるのですね、これはなかなか大変です・・
簡易的に行う方法はなさそうなので、どうしても必要という状況出ない限り代替手段を探したほうがよさそうです。
大変参考になりました、ありがとう御座います

2012/08/13 15:38:22
  • id:a-kuma3
    閉めるの早いよ。

    http://blog.sarabande.jp/post/12073244097?f8626640
  • id:n_maco2
    ご回答ありがとうございます、また申し訳ありません、ちょと性急でした。
    1行で判断できるおは、これは有用な手段ですね、大変参考になります!
    ポイントをお渡しできないのが大変申し訳無いのですが、ありがとうございました!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません