我在对象中有一些属性$ abc(类型数组):
$this->abc = array(
'id' => 123,
'status' => 'close'
);
使用此属性作为数组或字符串有一些解决方案吗?像那样:
echo $this->abc; // return first element of array: 123
echo $this->abc['status']; // return element by key: close
也许是getter and setter或者反思?
修改
我准备了一些这样的,但都返回id值:
class Test {
private $abc;
public function __construct() {
$this->abc = array(
'id' => '123',
'status' => 'close'
);
}
public function __get($key) {
if ($key === 'abc') {
echo $this->abc['id'];
}
}
}
$t = new Test();
echo $t->abc['id']; // return 123 - correct!
echo $t->abc['status']; // return 123 - incorrect, should be return 'close' string
echo $t->abc; // return 123 - correct
有什么建议吗?
答案 0 :(得分:2)
如果您想在获取或设置值时处理该值,可以使用__get
/ __set
答案 1 :(得分:2)
您可以使用魔术方法__set
和__get
,例如
class someClass{
private $_arr = array();
public function __set($key, $val){
if(!array_key_exists($key, $this->_arr)){
$this->_arr[$key] = array();
}
$this->_arr[$key] = array_merge($this->_arr[$key], (array)$val);
}
public function &__get($key) {
return $this->_arr[$key];
}
}
$obj = new someClass();
$obj->setvalue = array(5,6,7);
$obj->setvalue = 4;
答案 2 :(得分:2)
实际上你不能完全按照你的例子所示。
魔术方法(愚蠢的名字,顺便说一句)只是让你获取和设置属性,以便some_object->a
可以使用自定义代码处理,但你不能告诉PHP处理
<{1}}和some_object->a
不同。
你可以自由地让你的自定义getter返回一个int,一个数组或一个大象,但就是这样。
编辑:每次引用该属性时,您的代码都不会打印abc ['id']。
abc仍被处理为任何普通的旧财产。
让我们用return
替换echosome_object->a[0]
现在每当你引用abc时,getter都会给你“123” 示范:
public function __get($key) {
if ($key === 'abc') {
return$this->abc['id'];
}
}
你也可以自由地做那样的蠢事:
echo $t->abc['id']; // 'id' evaluates to 0, so result is "1" ("123"[0])
echo $t->abc['status']; // same thing
echo $t->abc; // "123" - correct (of sorts)
echo $t->abc[1]; // "2" (2nd character of "123")
作为旁注,滥用自定义getter / setter将青蛙变成王子可能会很有趣并且可以很好地展示PHP专业知识,但它不太可能产生可读和可维护的代码。
当然,只是我的意见。
答案 3 :(得分:0)
您也可以这样做
reset($this->abc);
表示第一个元素。