2

undefinedphpのデータ型ですか?また、それをどのようにチェックしますか(変数で、未定義であるかどうか)?

4

6 に答える 6

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

于 2013-01-14T00:18:24.697 に答える
3

いいえ、undefinedはPHPのデータ型ではありません。nullPHPで変数が設定されている(つまり、以前に定義されていない)かどうかを確認しますisset()

if( isset( $foo)) { 
    echo "Foo = $foo\n";
} else {
    echo "Foo is not set!\n";
}

ドキュメントから、次のようにisset()なります。

変数が設定されていて、NULLでないかどうかを判別します。

于 2013-01-14T00:17:13.347 に答える
3

NULL未定義変数の暗黙の値です。issetに初期化された変数を無視するため、機能しません=NULL

変数が実際に存在するかどうかを調べるには、回避策を使用する必要があります。

if (in_array("varname", array_keys(get_defined_vars()))) {
于 2013-01-14T00:20:49.523 に答える
2

変数が定義されているかどうかを確認するには、次のことを試してください。

<?php
if(isset($myvar)){
echo 'your variable is set as' . $myvar;
}else{
echo 'your variable is not set';
}
?>

また、私が知る限り、「undefined」はPHPのデータ型ではありません。

于 2013-01-14T00:17:49.687 に答える
1

未定義ではありませんが、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 または任意のプログラミング言語内で有効なデータ型である場合、基本的に変数を操作する機能が必要になります。それらは既に使用されているためです。

于 2013-01-14T00:21:39.807 に答える
0

(ちょっとやり過ぎかもしれませんが)

独自の未定義型を模倣する 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 でシングルトン デザイン パターンを作成する

于 2013-04-18T22:42:26.887 に答える