php中的empty()为内容返回true

时间:2013-06-06 05:21:23

标签: php class override

我有一个类在返回值之前覆盖__get。为什么empty()总是会返回?它的作用就像if __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

2 个答案:

答案 0 :(得分:1)

这个帖子解决了我的问题:empty() returning TRUE on object's non-empty property

解决方案是同时使用__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];
    }
  }

答案 1 :(得分:1)

要通过空检查,您需要实施魔法__isset。 在你的情况下,它将像

一样简单
public function __isset($name){
    return isset($this->_data[$name]);
}