不同属性的不同getter和setter

时间:2011-06-06 15:20:44

标签: php

在C#中,可以为每个属性(属性)定义和填充不同的getter和setter,但在php中它看起来是所有属性的通用网关。是否有一种方法可以为每个属性定义getter和setter,如下面C#中所示的代码:

private string hello;
private string world;

public string Hello
{
    get{ return hello;}
    set{ hello = value + "this one is hello";
}

public string World
{
    get{return world;}
    set{world = value + "this one is world";
}

我想要的是为某些特定属性定义不同的getter和setter的类似方法。

修改

我知道一种方法,但他们需要像set_attr1($value){}get_attr1(){}之类的函数调用并声明private $attr1,但正如您所看到的,这不是我想要的。我希望在我到达$attr1

时自动调用它们

感谢。

1 个答案:

答案 0 :(得分:5)

你可以设置一个带有switch case的魔术方法,但这不能解决100%的问题,因为除非该属性不存在或者无法从调用者访问其范围,否则不会调用magic方法:

class Foo {
   private $bar = 'hello';
   private $baz = 0;

   public function __set($var, $value) {
       switch ($var) {
           case 'bar':
               $this->$var .= $value;
               break;
           case 'baz':
               $this->$var += $value;
               break;
       }
   }

   public function hello() {
       $this->bar = 'world'; // __set is not called here
   }
}

$foo = new Foo;
$foo->bar = 'world';         // __set is called here

你可以通过在你的属性名称之前添加一个下划线来解决这个问题。但这仍然非常像一个黑客:

class Foo {
   private $_bar = 'hello';
   private $_baz = 0;

   public function __set($var, $value) {
       $actual_var = "_$var";
       switch ($var) {
           case 'bar':
               $this->$actual_var .= $value;
               break;
           case 'baz':
               $this->$actual_var += $value;
               break;
           default:
               $this->$var = $value;
       }
   }

   public function hello() {
       $this->bar = 'world'; // __set is called here too
   }
}

总之,我认为你最好为每个属性定义单独的setter / getters方法,以消除任何歧义:

class Foo {
    private $bar = 'hello';

    public function setBar($value) {
        $this->bar .= $value;
    }
}