isset() 创建一个对象属性


isset() creating an Object property

今天,我在测试我的应用程序时发现了一个问题,我不知道如何解释这一点:

我有一个简单的条件:

if(isset($entity->filter)) {
    $var = "text";    
}

服务器返回

对象 { id: 0, 名称: "a"

, 链接: "a" }

确定(返回预期对象)

但是当我把我的条件改成这样时:

if(isset($entity->filter["where"])) {
    $var = "text";    
}

服务器返回

对象 { id: 0, 名称: "a",

链接: "a", 过滤器: 空 }

错误(对象已设置"过滤器"属性)

你能向我解释一下,为什么第二个条件中的 isset() 函数会将"filter"属性设置为我的对象吗?

//编辑

我创建了一个测试PHP代码,它可以重现上面的错误:

<?php
class testObj {
    public function __set($name, $value) {
        $this->$name = $value;
    }
    public function &__get($name) {
        return $this->$name;
    }
}
$obj = new testObj();
$obj->p1 = "test";
$obj->p2 = 10;
$obj->p3 = true;
var_dump($obj);
if(isset($obj->p4["arr"])) {
    // do something
}
var_dump($obj);

输出

object(testObj)#1 (3) { ["p1"]=> string(4) "test" ["p2"]=>

int(10) ["p3"]=> bool(true) } object(testObj)#1 (4) { ["p1"]=> string(4) "test" ["p2"]=> int(10) ["p3"]=> bool(true) ["p4"]=> NULL }

在第一个条件 isset() 访问$entity检查属性是否存在。在 Seccond 条件下,显式访问属性 $entity->filter。当您访问 das 不存在的属性时,将生成该属性并使用 null 初始化。然后,您可以使用它或为其分配值。因为 isset() 访问该属性以检查它是否是一个具有键"where"的数组,所以它会生成一个带有 null 的属性。这称为重载以生成动态属性:http://php.net/manual/en/language.oop5.overloading.php