isset() return 对于非空私有 属性 false
isset() return false for a non-null private property
我不明白为什么如果我执行这段代码,它会打印 true
$a = $myobject[0]->myproperty;
echo isset($a) ? "true" : "false";
但是这个结果是错误的:
echo isset($myobject[0]->myproperty) ? "true" : "false";
对象 属性 没有被 PHP 解释为变量?在第二种情况下,我简单地替换了变量$a,直接在它的位置插入指令。
$m = MyObject::ByAttributes("My text on attribute property");
$myobject = [$m];
Class定义:
<?php
class MyObject implements JsonSerializable {
private $myproperty;
public static function ByAttributes($myproperty) {
$instance = new self();
$instance->myproperty = $myproperty;
return $instance;
}
public static function ByQuery(object $result) {
$instance = new self();
$instance->myproperty = isset($result->myproperty) ? $result->myproperty : null;
return $instance;
}
public function __get($property) {
if (property_exists($this, $property)) {
return $this->$property;
}
}
public function __set($property, $value) {
if (property_exists($this, $property)) {
$this->$property = $value;
}
return $this;
}
public function jsonSerialize() {
return get_object_vars($this);
}
public function __toString() {
return get_class($this) . "{" . implode(",", get_object_vars($this)) . "}";
}
}
?>
您的 myproperty
属性 是私人的,因此从 class 外部看不到 属性。
class Foobar {
private $bla = 42;
}
$o = new Foobar;
var_dump($o);
var_dump(isset($o));
var_dump(isset($o->bla));
这将生成以下输出:
object(Foobar)#1 (1) {
["bla":"Foobar":private]=>
int(42)
}
bool(true)
bool(false)
(在 PHP 7.2.14 (cli) 上,但对于 7.3.1 可能相同)
由于您正在使用 isset($myobject[0]->myproperty)
,因此您必须在您的方法中实施魔术 __isset
以获得调用 isset
的有效结果
public function __isset($property) {
return isset($this->$property);
}
我不明白为什么如果我执行这段代码,它会打印 true
$a = $myobject[0]->myproperty;
echo isset($a) ? "true" : "false";
但是这个结果是错误的:
echo isset($myobject[0]->myproperty) ? "true" : "false";
对象 属性 没有被 PHP 解释为变量?在第二种情况下,我简单地替换了变量$a,直接在它的位置插入指令。
$m = MyObject::ByAttributes("My text on attribute property");
$myobject = [$m];
Class定义:
<?php
class MyObject implements JsonSerializable {
private $myproperty;
public static function ByAttributes($myproperty) {
$instance = new self();
$instance->myproperty = $myproperty;
return $instance;
}
public static function ByQuery(object $result) {
$instance = new self();
$instance->myproperty = isset($result->myproperty) ? $result->myproperty : null;
return $instance;
}
public function __get($property) {
if (property_exists($this, $property)) {
return $this->$property;
}
}
public function __set($property, $value) {
if (property_exists($this, $property)) {
$this->$property = $value;
}
return $this;
}
public function jsonSerialize() {
return get_object_vars($this);
}
public function __toString() {
return get_class($this) . "{" . implode(",", get_object_vars($this)) . "}";
}
}
?>
您的 myproperty
属性 是私人的,因此从 class 外部看不到 属性。
class Foobar {
private $bla = 42;
}
$o = new Foobar;
var_dump($o);
var_dump(isset($o));
var_dump(isset($o->bla));
这将生成以下输出:
object(Foobar)#1 (1) {
["bla":"Foobar":private]=>
int(42)
}
bool(true)
bool(false)
(在 PHP 7.2.14 (cli) 上,但对于 7.3.1 可能相同)
由于您正在使用 isset($myobject[0]->myproperty)
,因此您必须在您的方法中实施魔术 __isset
以获得调用 isset
public function __isset($property) {
return isset($this->$property);
}