と同じものではないので__isset
、そうではありませんisset()
empty()
4 に答える
このページにあるように:
__isset() は、アクセスできないプロパティで isset() または empty() を呼び出すことによってトリガーされます。
empty() 専用のマジックメソッドはありません
__isset() が true を返す場合、empty() は __get() を呼び出してプロパティの値をチェックします。
インスパイアの答えへの追加として:
class Foo {
public function __isset($name) {
echo "public function __isset($name)\n";
return 'bar'===$name;
}
public function __get($name) {
echo "public function __get($name)\n";
return 'bar'===$name ? 0 : NULL;
}
}
$foo = new Foo;
echo empty($foo->foo) ? ' empty' : ' not empty', "\n";
echo empty($foo->bar) ? ' empty' : ' not empty', "\n";
出力は
public function __isset(foo)
empty
public function __isset(bar)
public function __get(bar)
empty
最初のプロパティ(foo)の意味empty()はfalseを返した__isset()のみを呼び出しました-> empty($foo->foo)===true
2番目のプロパティ(bar)の場合__isset()が呼び出され、trueを返しました。次に、プロパティは__get()を介してフェッチされ、ブール値として解釈されます(http://docs.php.net/language.types.type-jugglingを参照)。また、(bool)0はであるためfalse
、empty()はtrue
empty($foo->bar)
一般的には、以下が PHP と同等であることがわかると思います。
isset($variable[0])
たとえば、変数が文字列の場合、文字列が空であることを検出します。ほとんどのプリミティブ型 (すべてではないにしても) で同様に機能します。
クラス変数が存在するかどうかをテストしているだけなら、うまくいきませんproperty_exists()
か?