PHP と JavaScript の変数存在するかチェック
- カテゴリ:
- JavaScript
- PHP
- コメント数:
- Comments: 1
◆ プロパティや配列はキーがあるかをチェック
◆ null や undefined など未定義値を自分で入れたのを無視(存在しない扱い)したいなら
◆ PHP → isset
◆ JavaScript → typeof xxx !== "undefined"
◆ PHP の isset に $$var_name とすれば変数に入ってる文字列を変数名としてチェックできる
◆ null や undefined など未定義値を自分で入れたのを無視(存在しない扱い)したいなら
◆ PHP → isset
◆ JavaScript → typeof xxx !== "undefined"
◆ PHP の isset に $$var_name とすれば変数に入ってる文字列を変数名としてチェックできる
JavaScript
プロパティ
JavaScript ではオブジェクト(配列も一緒)にプロパティがあるかのチェックは簡単です
key in obj
と書くだけ
var obj = {
a: 1,
b: undefined
}
console.log("a" in obj)
console.log("b" in obj)
console.log("c" in obj)
a: 1,
b: undefined
}
console.log("a" in obj)
console.log("b" in obj)
console.log("c" in obj)
true
true
false
true
false
var arr = [100]
arr[2] = undefined
console.log(0 in arr)
console.log(1 in arr)
console.log(2 in arr)
arr[2] = undefined
console.log(0 in arr)
console.log(1 in arr)
console.log(2 in arr)
true
false
true
false
true
undefined であってもキーが存在すれば true になります
delete 削除じゃなくて undefined 代入してるから undefined は存在しない扱いにしたいというのなら
console.log(obj.b !== undefined)
とすれば キーがない未定義も undefined も undefined なので判定できます
すごく簡単
グローバル
では 次はプロパティ以外のときグローバル変数は window オブジェクトのプロパティなのでさっきの例の obj を window にするだけです
var x = 10
console.log(x in window) // true
console.log(y in window) // false
console.log(x in window) // true
console.log(y in window) // false
ローカル
ローカルスコープはたしか Call オブジェクト?のプロパティとかだったような記憶がありますがそのオブジェクトは JavaScript 上で扱えないのでプロパティとして考える方法はできませんということで typeof を使います
!function(){
var a = 1
var b = undefined
console.log(typeof a !== "undefined")
console.log(typeof b !== "undefined")
console.log(typeof c !== "undefined")
}()
var a = 1
var b = undefined
console.log(typeof a !== "undefined")
console.log(typeof b !== "undefined")
console.log(typeof c !== "undefined")
}()
true
false
false
false
false
typeof は 「!」 みたいに右側を評価した結果を扱う演算子なので 未定義な c とかエラーでるんじゃないの?? って思いそうですが なんとエラーはでずに型チェックできるんです
おどろきですよね
ただこれは未定義でも undefined でも同じ扱いになります
また スコープチェーンのせいでローカルの外側で定義されてる場合と区別できないという欠点はあります
その変数にエラー出さずにアクセス可能かという使い方なら問題ないはずです
JavaScript (文字列)
今度は JavaScript でチェックしたい変数名を文字列で持っている場合の方法ですプロパティの場合は上で書いた in を使ってキーの有無をチェックする方法が文字列なのでそのままです
なので ローカル変数の場合について
var var_name = "xxxx"
var_name に入ってる変数名の変数があるか知りたいという時です
typeof をしたいのですが ローカル変数は文字列からその変数を参照できないので普通にはできなそうです
ということでちょっとむりやり
console.log(eval(`typeof ${var_name}`) !== "undefined")
eval 使って文字列からローカル変数を参照します
!function(){
var var_name = "xxxx"
var xxxx = 100
console.log(eval(`typeof ${var_name}`) !== "undefined")
var_name = "yyyy"
console.log(eval(`typeof ${var_name}`) !== "undefined")
}()
var var_name = "xxxx"
var xxxx = 100
console.log(eval(`typeof ${var_name}`) !== "undefined")
var_name = "yyyy"
console.log(eval(`typeof ${var_name}`) !== "undefined")
}()
true
false
false
文字列からローカル変数って eval でもしないと取れないんだから必要がない気もします
PHP
プロパティ
PHP でもプロパティ・連想配列のキーのときは JavaScript と同じような感じですキーが存在するかを見れば null を入れていても true で null かチェック (isset) すれば未定義か null でなければ true です
$obj = new StdClass();
$obj->a = 1;
$obj->b = null;
var_dump(property_exists($obj, "a"));
var_dump(property_exists($obj, "b"));
var_dump(property_exists($obj, "c"));
var_dump(isset($obj->a));
var_dump(isset($obj->b));
var_dump(isset($obj->c));
$obj->a = 1;
$obj->b = null;
var_dump(property_exists($obj, "a"));
var_dump(property_exists($obj, "b"));
var_dump(property_exists($obj, "c"));
var_dump(isset($obj->a));
var_dump(isset($obj->b));
var_dump(isset($obj->c));
bool(true)
bool(true)
bool(false)
bool(true)
bool(false)
bool(false)
bool(true)
bool(false)
bool(true)
bool(false)
bool(false)
$assoc = ["a" => 1, "b" => null];
var_dump(array_key_exists("a", $assoc));
var_dump(array_key_exists("b", $assoc));
var_dump(array_key_exists("c", $assoc));
var_dump(isset($assoc["a"]));
var_dump(isset($assoc["b"]));
var_dump(isset($assoc["c"]));
var_dump(array_key_exists("a", $assoc));
var_dump(array_key_exists("b", $assoc));
var_dump(array_key_exists("c", $assoc));
var_dump(isset($assoc["a"]));
var_dump(isset($assoc["b"]));
var_dump(isset($assoc["c"]));
bool(true)
bool(true)
bool(false)
bool(true)
bool(false)
bool(false)
bool(true)
bool(false)
bool(true)
bool(false)
bool(false)
グローバル・ローカル
JavaScript と違ってグローバルがオブジェクトのプロパティでないのでグローバルもローカルも同じになりますPHP の typeof は JavaScript みたいなことはできませんが 単純に isset するだけで存在するか確認できます
$a = 1;
$b = null;
var_dump(isset($a));
var_dump(isset($b));
var_dump(isset($c));
$b = null;
var_dump(isset($a));
var_dump(isset($b));
var_dump(isset($c));
bool(true)
bool(false)
bool(false)
bool(false)
bool(false)
isset なので null を入れていても false になってしまう欠点があります
null もしくは未定義かのチェックではなく 変数が存在するかを知りたいときは get_defined_vars で宣言されてる変数一覧を取得できるのでここから array_key_exists を行います
$a = 1;
$b = null;
var_dump(array_key_exists("a", get_defined_vars()));
var_dump(array_key_exists("b", get_defined_vars()));
var_dump(array_key_exists("c", get_defined_vars()));
$b = null;
var_dump(array_key_exists("a", get_defined_vars()));
var_dump(array_key_exists("b", get_defined_vars()));
var_dump(array_key_exists("c", get_defined_vars()));
bool(true)
bool(true)
bool(false)
bool(true)
bool(false)
PHP (文字列)
PHPの場合は typeof がなくてどれもプロパティや連想配列のキーとしてチェックしているので文字列で変数名が入っていてもそのままですisset をしたいときはちょっと特殊で $$var_name のように $$ になります
$a = 1;
$b = null;
$var_name = "a";
var_dump(isset($$var_name));
$var_name = "b";
var_dump(isset($$var_name));
$var_name = "c";
var_dump(isset($$var_name));
$b = null;
$var_name = "a";
var_dump(isset($$var_name));
$var_name = "b";
var_dump(isset($$var_name));
$var_name = "c";
var_dump(isset($$var_name));
bool(true)
bool(false)
bool(false)
bool(false)
bool(false)
めったに使わないので忘れがちですが PHP では $ をいっぱいつけると 変数に入ってる文字列を変数名に使えるというわかりやすいようなわかりにくいような機能があるんですよね
http://var.blog.jp/archives/27827447.html