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
感谢。
答案 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;
}
}