isset () возвращает false для ненулевого частного свойства - PullRequest
0 голосов
/ 23 февраля 2019

Я не могу понять, почему, если я выполню этот код, он напечатает true

$a = $myobject[0]->myproperty;
echo isset($a) ? "true" : "false";

Но с этим результатом будет 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)) . "}";
  }
}
?>

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Поскольку вы используете isset($myobject[0]->myproperty), вы должны реализовать магию __isset в своем методе, чтобы получить действительный результат для вызова isset

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

php.net - __isset

0 голосов
/ 24 февраля 2019

Ваше свойство 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)

...