人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

●質問者: n_maco2
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● oil999
●200ポイント ベストアンサー

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

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);
?>

n_maco2さんのコメント
ご回答ありがとうございます。 しかし、issetではnullの場合でもfalseを返してきてしまうので、nullなのか未定義なのかが見分けがつかないので困っている状態です。 >「未定義」という用語の定義を明らかにされた方がよいと思います。 説明不足でしたでしょうか、申し訳ありません。 そこまでのコードで一度もその変数に対して代入などの操作が行われておらずメモリ上に値が存在しない状態、という説明で足りますでしょうか。

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

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

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ