如何指定get和set方法/函数作为类的一部分' PHP中的属性?

时间:2014-03-26 08:22:28

标签: php object setter getter

使用PHP,我如何定义/声明getter和setter方法/函数作为类中属性声明的一部分?

我要做的是将getter和setter方法指定为属性的一部分,而不是声明单独的set_propertyName($value)get_propertyName()函数/方法。

我得到了什么:

class my_entity {
    protected $is_new;
    protected $eid; // entity ID for an existing entity
    public function __construct($is_new = FALSE, $eid = 0) {
        $this->is_new = $is_new;
        if ($eid > 0) {
            $this->set_eid($eid);
        }
    }

    // setter method
    public function set_eid($eid) {
        $is_set = FALSE;
        if (is_numeric($eid)) {
            $this->eid = intval($eid);
            $is_set = TRUE;
        }
        return $is_set;
    }
}

我想要什么(没有制作$ this-> eid一个对象):

class my_entity {
    protected $is_new;
    // entity ID for an existing entity
    protected $eid {
      set: function($value) {
        $is_set = FALSE;
        if (is_numeric($value)) {
            $this->eid = intval($value);
            $is_set = TRUE;
        }
        return $is_set;

      }, // end setter

    }; 
    public function __construct($is_new = FALSE, $eid = 0) {
        $this->is_new = $is_new;
        if ($eid > 0) {
            $this->set_eid($eid);
        }
    }

    // setter method/function removed
}

2 个答案:

答案 0 :(得分:1)

PHP每个类只允许一个getter和一个setter函数,它们是__get& __set魔术方法。这两个魔术方法必须处理所有私有/不可访问属性的get和set请求。 http://www.php.net/manual/en/language.oop5.magic.php

private function set_eid($id)
{
    //set it...
    $this->eid = $id;
}

private function get_eid($id)
{
    //return it...
    return $this->eid;
}

public function __set($name, $value)
{
    switch($name)
    {
        case 'eid':
            $this->set_eid($value);
        break;
    }
}

public function __get($name)
{
    switch($name)
    {
        case 'eid':
            return $this->get_eid();
        break;
    }
}

在2个switch语句中,您还可以添加其他属性的名称。

重要的是要记住__get__set仅在变量无法访问时才会被调用,这意味着当从类中获取或设置时,您仍然需要手动调用{{1} }。

答案 1 :(得分:0)

对于PHP 5.5,这是proposed,但是vote未能获得将其接受到核心所需的必要的2/3多数,因此它不会被实现(尽管代码实施已提交的变更。)

完全有可能(当时出现了大量新的PHP引擎和Hacklang),它将在未来重新提交,特别是如果Hacklang决定实施它;但目前在PHP中没有使用C#getters / setter的选项