【发布时间】: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() 方法扩展了另一个类。