如何使用魔术方法访问多个属性(__ get& __set)?

时间:2013-07-17 15:31:13

标签: php magic-methods

我最近研究过魔术方法,__get__set,并想知道如何在课堂上实际设置和获取多个属性。

我知道它只与一个变量或数组完美配合,但我不确定访问多个变量。

有没有人可以向我解释这个?

class myMagic2 {
    public $data;
    public $name;
    public $age;

    public function __set($item, $value) {
        $this->item = $value;
    }

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

有没有办法访问所有变量($data$name$age)?

2 个答案:

答案 0 :(得分:3)

当我在项目中工作时,我总是有这些方法:

public function __set($name, $value) 
{
    //see if there exists a extra setter method: setName()
    $method = 'set' . ucfirst($name);
    if(!method_exists($this, $method))
    {
        //if there is no setter, receive all public/protected vars and set the correct one if found
        $vars = $this->vars;
        if(array_search("_" . $name, $vars) !== FALSE)
            $this->{"_" . $name} = $value;
    } else
        $this->$method($value); //call the setter with the value
}

public function __get($name) 
{
    //see if there is an extra getter method: getName()
    $method = 'get' . ucfirst($name);
    if(!method_exists($this, $method)) 
    {
        //if there is no getter, receive all public/protected vars and return the correct one if found
        $vars = $this->vars;
        if(array_search("_" . $name, $vars) !== FALSE)
            return $this->{"_" . $name};
    } else
        return $this->$method(); //call the getter
    return null;
}

public function getVars()
{
    if(!$this->_vars)
    {
        $reflect = new ReflectionClass($this);
        $this->_vars = array();
        foreach($reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED) as $var)
        {
            $this->_vars[] = $var->name;
        }
    }
    return $this->_vars;
}

因此,如果我想在写入/返回之前操作它们,我可以自由地为属性创建额外的setter / getter。如果属性不存在setter / getter,则它会回退到属性本身。使用getVars()方法,您可以从类中接收所有公共属性和受保护属性。

我的类属性总是用一个undercorce定义,所以你应该改变它。

答案 1 :(得分:0)

你可以遵循这种模式。

注意:在帖子的示例中,不会为$obj->data$obj->name$obj->age调用魔术方法,因为这些值已经可以作为公共属性访问。我将它们更改为受保护并更改名称以隐藏它们。

<?php
class myMagic2{
    protected $_data;
    protected $_name;
    protected $_age;

    public function __set($item, $value){
        switch($item){
            case "data":
                $this->_data = $value;
                break;
            case "name":
                $this->_name = $value;
                break;
            case "age":
                $this->_age = $value;
                break;
            default:
                throw new Exception("Property $name does not exist.");

        }

    }

    public function __get($item){
        switch($item){
            case "data":
                return $this->_data;
                break;
            case "name":
                return $this->_name;
                break;
            case "age":
                return $this->_age;
                break;
            default:
                throw new Exception("Property $name does not exist.");
                break;

        }
    }
}

通常你会多做一些,然后使用魔术方法作为代理来设置和获取类属性。你会这样验证或过滤或以其他方式增加操作。如果您要获取或设置属性,您可以将属性公之于众,并使用魔术方法放弃。