在php中为类自动生成getter和setter的最佳方法是什么?

时间:2009-09-25 09:46:11

标签: php eclipse class get set

我经常创建一个包含一些私有变量的类。 设置此类的实例时,应该可以使用getter和setter填充类的所有变量。

有没有一种简单的方法可以在创建类时不必为每个变量键入所有这些setter和getter?

现在我必须为类

中的每个var键入此内容
public function setVar($var){
$this->var = $var;
}

public function getVar(){
return $this->var;
}

我们现在使用RegExp,但我不知道这是否是最简单的方法... 我们使用Eclipse作为环境,所以也许有一些有用的插件?

5 个答案:

答案 0 :(得分:33)

使用Eclipse转到首选项 - > PHP - >编辑 - >模板 - >新的并使用这样的东西:

private $$${PropertyName};
${cursor}    
public function get${PropertyName}() 
{
  return $$this->${PropertyName};
}

public function set${PropertyName}($$value) 
{
  $$this->${PropertyName} = $$value;
}

要使用模板键入它的名称并按ctrl + space - 键入名称时也应自动显示上下文菜单。

答案 1 :(得分:2)

你看过__set和__get方法了吗?不知道这是不是你的意思,但每当一个类成员被设置或被检索/获取/访问时都会自动调用。

答案 2 :(得分:1)

Zend Studio具有自动getter / setter生成功能。

答案 3 :(得分:1)

我认为最好的方法是将__set和__get与一些字符串函数一起使用,让我告诉你。

class UserProfile
{
    public function __get($key)
    {
        if(isset($this->$key))
        {
            return $this->$key;
        }
    }

    public function __set($key,$val)
    {
        $this->cahnge($key,$val);
    }

    public function __call($key,$params)
    {
        if(substr("set",$key))
        {
            //Update
        }elseif(substr("get",$key))
        {
            //return
        }

        //Else Blah
    }

    private function change($key,$val)
    {
        if(isset($this->$key))
        {
            $this->$key = $val;
        }
    }
}

__call()方法允许您使用

等功能进行设置

$profile->setUsername('Robert Pitt');只要您substr设置/获取并检查字符串的其余部分作为类的值:)

另一个例子

public function __call($method,$params = array())
{

    if(isset($params[0]) && is_string($params[0]))
    {
        $this->$method = $params[0];
    }
}

//....

$profile->username('Robert Pitt');

这里有更多工作要做

答案 4 :(得分:0)

也许更好的溶解:

class base {

    protected $_vars = array();


    public function setVar($name, $value = null) {
        $this->_vars[$name] = $value;
    }

    public function getVar($name) {
        return isset($this->_vars[$name]) ? $this->_vars[$name] : null;
    }
}

简单地扩展这个类。或者你也可以使用__set和__get方法,但它们要慢得多。