PHP Magic方法将属性用作数组或字符串

时间:2014-01-10 12:47:38

标签: php magic-methods

我在对象中有一些属性$ 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

有什么建议吗?

4 个答案:

答案 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

替换echo
some_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);

表示第一个元素。