undefined
phpのデータ型ですか?また、それをどのようにチェックしますか(変数で、未定義であるかどうか)?
6 に答える
PHP には「未定義」のデータ型はありません。で変数が設定されているかどうかを確認できますが、これでは、変数がまったく設定されていないことと値isset
があることを区別できません。null
var_dump(isset($noSuchVariable)); // false
$nullVariable = null;
var_dump(isset($nullVariable)); // also false
compact
ただし、変数の値が であっても、変数が定義されているかどうかを判断できるトリックがありますnull
。
var_dump(!!compact('noSuchVariable')); // false
var_dump(!!compact('nullVariable')); // true
実例。
両方ともisset
、このcompact
トリックは一度に複数の変数に対しても機能します (カンマ区切りのリストを使用します)。
null
配列キーを扱う場合、値と完全な不在を簡単に区別できます。
$array = array('nullKey' => null);
var_dump(isset($array['nullKey'])); // false
var_dump(array_key_exists($array, 'nullKey')); // true
実例。
オブジェクトのプロパティを扱う場合、 for オブジェクトproperty_exists
に相当するもあります。array_key_exists
いいえ、undefinedはPHPのデータ型ではありません。null
PHPで変数が設定されている(つまり、以前に定義されていない)かどうかを確認しますisset()
。
if( isset( $foo)) {
echo "Foo = $foo\n";
} else {
echo "Foo is not set!\n";
}
ドキュメントから、次のようにisset()
なります。
変数が設定されていて、NULLでないかどうかを判別します。
NULL
未定義変数の暗黙の値です。isset
に初期化された変数を無視するため、機能しません=NULL
。
変数が実際に存在するかどうかを調べるには、回避策を使用する必要があります。
if (in_array("varname", array_keys(get_defined_vars()))) {
変数が定義されているかどうかを確認するには、次のことを試してください。
<?php
if(isset($myvar)){
echo 'your variable is set as' . $myvar;
}else{
echo 'your variable is not set';
}
?>
また、私が知る限り、「undefined」はPHPのデータ型ではありません。
未定義ではありませんが、null
違いはあります。は有効なデータ型ではありませundefined
ん。すべての変数を定義する必要があります。に:
$Foo = "Test";
if (isset($Foo))
{
echo "Variable Is Defined";
}
else
{
echo "Variable Is not Defined";
}
if (isset($UndefinedVar))
{
echo "Variable Is Defined";
}
else
{
echo "Variable Is Not Defined";
}
各ステートメントの出力は次のようになります。
1) 変数が定義されている
2) 変数が定義されていません
未定義の変数が PHP または任意のプログラミング言語内で有効なデータ型である場合、基本的に変数を操作する機能が必要になります。それらは既に使用されているためです。
(ちょっとやり過ぎかもしれませんが)
独自の未定義型を模倣する 2 つのかなり「単純な」方法を次に示します。関数呼び出しのオーバーヘッドにより、キーワードglobalを使用せずにコードで使用できるようになります。
<?php
class undef1{function __toString(){return 'undefined';}}
function undef1(){
static $C;
if($C===null){$C = new undef1();}
return $C;
}
echo 'undef1 in string context : '; var_dump( undef1().'');
echo 'undef1 in boolean context: '; var_dump( !!undef1() );
echo 'undef1 compared to itself: '; var_dump( (undef1() === undef1()) );
class undef2 extends SimpleXMLElement{function __toString(){return 'undefined';}}
function undef2(){
static $C;
if($C===null){$C = new undef2('<C/>');}
return $C;
}
echo 'undef2 in string context : '; var_dump( undef2().'');
echo 'undef2 in boolean context: '; var_dump( !!undef2() );
echo 'undef2 compared to itself: '; var_dump( (undef2() === undef2()) );
?>
出力 (PHP 5.3.23):
undef1 in string context : string(9) "undefined" // :)
undef1 in boolean context: bool(true) // :(
undef1 compared to itself: bool(true) // :)
undef2 in string context : string(0) "" // :( ?
undef2 in boolean context: bool(false) // :)
undef2 compared to itself: bool(true) // :)
どちらの場合でも、JavaScript のように感じさせるのは難しいようです。
オブジェクトを boolean false に評価するために、2 番目のソリューションは、PHP がSimpleXMLElement オブジェクトを処理する方法にハックを使用します。ただし、一部のコードがundef2オブジェクトの XML 値を変更すると、同じハックが逆効果になる可能性があります。
残念なことに、魔法の関数 __ toString()は、SimpleXMLElement クラスを拡張すると皮肉なことに役に立たなくなります。カスタム文字列を返すオーバーロードする別の関数があるかもしれませんが、見つかりません。実際には空の文字列の方が実用的かもしれませんが。
undef1クラスをブール値の false に評価する可能性のあるPECL 演算子のオーバーロードがありますが、拡張機能はベータ版であり、PHP コードでは使用できない可能性があります。
その他の注意事項:
未定義の型は、次のことが可能な ArrayAccess を実装するカスタム クラスにとって非常に理にかなっているようです。
- $value ===未定義の場合、要素の作成を無視する
- キーまたはインデックスが定義されていない場合はundefinedを返します
上記の例では、クラスはシングルトンに制限されていません。必要に応じて、そのように動作させることもできます: PHP5 でシングルトン デザイン パターンを作成する