isset()创建一个Object属性

时间:2016-03-01 14:39:09

标签: php isset

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

我的条件很简单:

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

服务器返回

     

对象{id:0,名称:“a”,链接:“a”}

     

确定(返回预期对象)

但是当我改变我的条件时:

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

服务器返回

     

Object {id:0,name:“a”,link:“a”,filter:null}

     

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

你能解释一下,为什么第二个条件下的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”] =&gt; string(4)“test”[“p2”] =&gt; int(10)[“p3”] =&gt;布尔(真)}   object(testObj)#1(4){[“p1”] =&gt; string(4)“test”[“p2”] =&gt; int(10)[“p3”] =&gt; bool(true)[“p4”] =&gt; NULL}

1 个答案:

答案 0 :(得分:1)

在第一个条件中,isset()访问$ entity,检查属性是否存在。在Seccond条件下,您可以显式访问属性$ entity-&gt;过滤器。当您访问属性时,不存在该属性,将生成该属性并使用null初始化。然后你可以使用它或为它赋值。因为isset()访问该属性以检查它是否是具有键的数组&#34;其中&#34;,它生成一个null属性。这称为重载以生成动态属性:http://php.net/manual/en/language.oop5.overloading.php