isset() 创建对象 属性
isset() creating an Object property
今天,我在测试我的应用程序时发现了一个问题,我不知道如何解释:
我的条件很简单:
if(isset($entity->filter)) {
$var = "text";
}
Server return
Object { id: 0, name: "a", link: "a" }
OK (expected object is returned)
但是当我将条件更改为:
if(isset($entity->filter["where"])) {
$var = "text";
}
Server return
Object { id: 0, name: "a", link: "a", filter: null }
ERROR (object have set "filter" property)
你能给我解释一下,为什么第二种情况下的 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);
Output
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 }
在第一个条件中,set() 访问 $entity 并检查 属性 是否存在。在第二个条件中,您显式访问 属性 $entity->filter。当您访问 属性 不存在的内容时,将生成 属性 并使用 null 进行初始化。然后你就可以使用它或者给它赋值了。因为 isset() 访问 属性 来检查它是否是一个具有键 "where" 的数组,它生成一个 属性 为空。这称为重载以动态生成属性:http://php.net/manual/en/language.oop5.overloading.php
今天,我在测试我的应用程序时发现了一个问题,我不知道如何解释:
我的条件很简单:
if(isset($entity->filter)) {
$var = "text";
}
Server return
Object { id: 0, name: "a", link: "a" }
OK (expected object is returned)
但是当我将条件更改为:
if(isset($entity->filter["where"])) {
$var = "text";
}
Server return
Object { id: 0, name: "a", link: "a", filter: null }
ERROR (object have set "filter" property)
你能给我解释一下,为什么第二种情况下的 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);
Output
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 }
在第一个条件中,set() 访问 $entity 并检查 属性 是否存在。在第二个条件中,您显式访问 属性 $entity->filter。当您访问 属性 不存在的内容时,将生成 属性 并使用 null 进行初始化。然后你就可以使用它或者给它赋值了。因为 isset() 访问 属性 来检查它是否是一个具有键 "where" 的数组,它生成一个 属性 为空。这称为重载以动态生成属性:http://php.net/manual/en/language.oop5.overloading.php