【问题标题】:magic __get() on end($array) or $var魔术 __get() on end($array) 或 $var
【发布时间】:2015-04-29 13:28:32
【问题描述】:

我想通过 php 的魔术 __get 方法访问数组的最后一个元素。

我是用php的end($array)来返回的。

如果我这样做:

class fun {
  protected $var = 'test';
  protected $arr = array(1, 2);

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

  public function get_array() {
    return end($this->arr);
  }
}

$obj = new fun();
var_dump($obj->var); //gives me: string(4) "test"
var_dump($obj->get_array()); //gives me: int(2);

一切正常。到目前为止一切顺利。

我不想对变量和数组使用不同的“getter”。我希望该方法找出是否调用了变量或数组,然后返回值。

我认为这也可以通过 $name 参数轻松完成:

class funfun {
  protected $var = 'more test';
  protected $arr = array(1, 2, 3);

  public function __get($name) {
    if(is_array($this->$name)) {
      $ret = end($this->$name);
    } else {
      $ret = $this->$name;
    }

    return $ret;
    }
}

$obj2 = new funfun();
var_dump($obj2->var); //gives me string(9);

但是

var_Dump($obj2->arr); // gives me:
//array(3) {[0]=> int(1) [1]=> int(2) [2]=> int(3)}

如果我在 __get() 方法中转储它:

public function __get($name) {
  if(is_array($this->$name)) {
    var_dump(end($this->$name));
  }

它给了我“正确”的结果:int(3)。

我错过了什么吗? 它是语义错误吗? PHP的return不是为此目的设计的吗?

【问题讨论】:

  • 我知道它不能回答你的问题,但是在我的本地 php 5.4/win 上它似乎按预期工作,结果我得到了 int(3)。在您的示例中,我所能想到的只是 is_array 检查由于某种未知原因而失败,这就是为什么您得到 //array(3) {[0]=> int(1) [1]=> int( 2) [2]=> int(3)} 结果。
  • 谢谢。我在这台机器上运行 5.3.10-1ubuntu3.17。回到家后,我将在我自己的最新内核上对其进行测试。不,最后一个 var_Dump() 部分在 if(is_array) 语句中。所以检查应该没问题
  • 我认为这正是让您感到困惑的地方。你能告诉我类中带有 var_dump 的代码吗?我认为你正在点击 $array 属性并且它没有触发魔法方法,这就是你得到这样结果的原因。
  • 在 PHP 5.5.14 上它返回 the expected result: int(3)
  • 是的。我刚刚发布了一个答案.. 看了 3 个小时的课程不知何故让我心碎,我再也无法调试了。原来的类用下面的 __construct() 方法扩展了另一个类。

标签: php arrays get


【解决方案1】:

所以问题(至少在家里)似乎是 __construct 方法中的“get”调用。忘记在原始代码中检查这个。

public function __construct() {
  $x = $this->arr;

  var_Dump($x);
 }

给我们:

//array(3) {[0]=> int(1) [1]=> int(2) [2]=> int(3)}

但是:

$obj2 = new _funfun();

$x = $obj2->arr;
var_dump($x);

向我们展示结果:int(3)

我将在明天工作的 5.3.10-1ubuntu3.17 下进一步研究这个。在我的家用机器 5.6.8 上,它现在按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2010-12-26
    • 1970-01-01
    • 2015-07-23
    • 2011-04-26
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多