【问题标题】:isset() creating an Object propertyisset() 创建对象属性
【发布时间】:2016-06-14 00:57:00
【问题描述】:

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

我的条件很简单:

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

服务器返回

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

OK(返回预期对象)

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

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

服务器返回

对象{ id:0,名称:“a”,链接:“a”,过滤器:null }

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

你能解释一下,为什么第二个条件中的 isset() 函数会为我的对象设置“过滤器”属性吗?

// 编辑

我创建了一个测试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" ]=> 空 }

【问题讨论】:

  • $entity->过滤这是字符串还是数组?
  • 现在是未定义的,但如果定义了,它总是数组
  • 试试$entity-&gt;{filter["where"]}
  • if(isset($entity-&gt;{filter["where"]})) ==> 意外 [ ..
  • 对不起...if(isset($entity-&gt;{$filter["where"]}))

标签: php isset


【解决方案1】:

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

【讨论】:

  • 谢谢你,你说得对……我不知道,那有可能重载isset()函数。
  • 你不要重载 isset() 函数。 isset() 访问不存在的属性,重载机制生成带有 null 的属性。
  • 对不起,我误解了你的评论。
猜你喜欢
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多