今天,当我测试我的应用程序并且我不知道时,我发现了一个问题,如何解释:
我的条件很简单:
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}
答案 0 :(得分:1)
在第一个条件中,isset()访问$ entity,检查属性是否存在。在Seccond条件下,您可以显式访问属性$ entity-&gt;过滤器。当您访问属性时,不存在该属性,将生成该属性并使用null初始化。然后你可以使用它或为它赋值。因为isset()访问该属性以检查它是否是具有键的数组&#34;其中&#34;,它生成一个null属性。这称为重载以生成动态属性:http://php.net/manual/en/language.oop5.overloading.php