0

__get値を返す前にオーバーライドするクラスがあります。に対して常に true を返すのはempty()なぜですか? __call関数の前ではなく空の後に値を返す場合のように動作します。

<?php
  class ref_dummy {
    private $_data = array();
    public function __get($name) {
      if (array_key_exists($name, $this->_data)) return $this->_data[$name];
      $this->_data[$name] = 'bar'; // load sample data
      return $this->_data[$name];
    }  
  }

  $dummy = new ref_dummy();

  if (empty($dummy->foo)) echo 'is empty' . '<br/>';
  else echo $dummy->foo . '<br/>';
?>

機能するかどうかはわかっていますが、なぜ機能しないの($dummy->foo)か疑問に思っています。empty()

フィドル: http://phpfiddle.org/main/code/dak-fjx

4

2 に答える 2

1

空のチェックを渡すには、マジックを実装する必要があります__isset。あなたの場合、それは次のように簡単です

public function __isset($name){
    return isset($this->_data[$name]);
}
于 2013-06-06T05:29:13.687 に答える
1

このスレッドは私の問題を解決しました: empty() オブジェクトの空でないプロパティで TRUE を返す

解決策は、__get と __isset の両方を使用することです。

  class ref_dummy {

    private $_data = array();

    public function __isset($name) {
      return $this->__get($name);
    }

    public function __get($name) {
      if (array_key_exists($name, $this->_data)) return $this->_data[$name];
      $this->_data[$name] = 'bar'; // load sample data
      return $this->_data[$name];
    }
  }
于 2013-06-06T05:27:37.167 に答える