件名、特にthis oneについて多くのSOの質問がありますが、それは私には役に立ちません。
property_exists
と の間にはあいまいさがあるisset
ので、質問する前に指摘しておきます。
property_exists
property_existsは、オブジェクトに値を確認せずにプロパティが含まれているかどうかをチェックし、その可視性のみを確認します。
したがって、次の例では:
<?php
class testA
{
private $a = null;
}
class testB extends testA
{
}
$test = new testA();
echo var_dump(property_exists($test, 'a')); // true
// parent's private property becomes invisible for its child
$test = new testB();
echo var_dump(property_exists($test, 'a')); // false
設定
issetは、値が に等しい場合は is が設定されていないことを考慮して、プロパティに値が存在するかどうかをチェックしますfalse
とnull
。
<?php
$var = null;
echo var_dump(isset($var)); // false
$var = '';
echo var_dump(isset($var)); // true
$var = false;
echo var_dump(isset($var)); // true
$var = 0;
echo var_dump(isset($var)); // true
$var = '0';
echo var_dump(isset($var)); // true
isset
property_exists
魔法のように追加されたプロパティに対するとの動作
プロパティにはnull
値が存在する可能性があるため、__isset
魔法の方法を使用してプロパティが存在するかどうかを知ることはできません。property_exists
また、魔法のメソッドを使用してプロパティが追加されるため、使用できません。
これはサンプルですが、これは単なるサンプルです。私のアプリでは、魔法のように設定されたプロパティが object の外部に格納されているためです。
class test {
private $data = array();
public function __get($key) {
echo "get $key\n";
return array_key_exists($key, $data) ? $data[$key] : null;
}
public function __set($key, $value) {
echo "set $key = $value\n";
$this->data[$key] = $value;
}
public function __isset($key) {
echo sprintf("isset $key ( returns %b )", isset($this->data[$key]));
return isset($this->data[$key]);
}
}
$test = new test();
$test->x = 42;
isset($test->x); // 1
$test->y = null;
isset($test->y); // 0
property_exists($test, 'y'); // 0
だからここに私の質問があります:
property_exist
魔法のように追加されたプロパティで実装する魔法のメソッドまたは SPL インターフェイスはありますか?