Php 对于非null私有属性,isset()返回false

Php 对于非null私有属性,isset()返回false,php,isset,Php,Isset,我不明白为什么如果我执行这段代码,它会打印为真 $a = $myobject[0]->myproperty; echo isset($a) ? "true" : "false"; 但这个结果是错误的: echo isset($myobject[0]->myproperty) ? "true" : "false"; PHP不将对象属性解释为变量?在第二种情况下,我简单地替换了变量$a,直接将指令插入其位置。 $m = MyObject::ByAttributes("My text

我不明白为什么如果我执行这段代码,它会打印为真

$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];
类别定义:

<?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 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相同)

您的
myproperty
属性是私有的,因此从类外部看不到该属性

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)

(在PHP7.2.14(cli)上,但可能与7.3.1相同)

因为您使用的是
isset($myobject[0]->myproperty)
您必须在方法中实现magic
\uISSET
以获得调用
isset
的有效结果

public function __isset($property) {
    return isset($this->$property);
}

由于您使用的是
isset($myobject[0]->myproperty)
您必须在方法中实现神奇的
\uu isset
,才能获得调用
isset的有效结果

public function __isset($property) {
    return isset($this->$property);
}

显示对象类(
$myobject[0]
)属性(
->myproperty
)。它是在类中设置的还是在
$a
之前的脚本中设置的?
$a
var\u dump
是什么?
$foo->bar
似乎不被视为变量,因此
isset()
返回
false
@Valentino谢谢,但这太奇怪了。13年过去了,我们还不知道对象的参数是一个变量(内存中的引用?),为什么要在声明为私有时访问
myproperty
?这不是你的
\uu get()
函数的作用吗?向我们展示对象类(
$myobject[0]
)属性(
->myproperty
)。它是在类中设置的还是在
$a
之前的脚本中设置的?
$a
var\u dump
是什么?
$foo->bar
似乎不被视为变量,因此
isset()
返回
false
@Valentino谢谢,但这太奇怪了。13年过去了,我们还不知道对象的参数是一个变量(内存中的引用?),为什么要在声明为私有时访问
myproperty
?这不是你的
\u get()
函数的作用吗?谢谢,如果我将myproperty属性更改为public,它就可以工作了。但我想保持这个变量的私密性。。。为什么PHP试图直接访问它,而不是通过重载机制?谢谢,如果我将myproperty属性更改为public,它就可以工作了。但我想保持这个变量的私密性。。。为什么PHP试图直接访问它,而不是通过重载机制?哇!这确实回答了我的问题。谢谢你!这确实回答了我的问题。非常感谢。