我使用魔术方法__call进行了实验。不知道我是否应该张贴它(因为其他答案和评论中的所有“请勿使用魔术方法”警告),但我将其留在这里..以防万一有人发现它有用。
public function __call($_name, $_arguments){
$action = substr($_name, 0, 4);
$varName = substr($_name, 4);
if (isset($this->{$varName})){
if ($action === "get_") return $this->{$varName};
if ($action === "set_") $this->{$varName} = $_arguments[0];
}
}
只需在类中添加该方法,现在您可以输入:
class MyClass{
private foo = "bar";
private bom = "bim";
// ...
// public function __call(){ ... }
// ...
}
$C = new MyClass();
// as getter
$C->get_foo(); // return "bar"
$C->get_bom(); // return "bim"
// as setter
$C->set_foo("abc"); // set "abc" as new value of foo
$C->set_bom("zam"); // set "zam" as new value of bom
这样,您就可以获取/设置类中的所有内容(如果存在的话),如果只需要几个特定元素,则可以使用“白名单”作为过滤器。
例:
private $callWhiteList = array(
"foo" => "foo",
"fee" => "fee",
// ...
);
public function __call($_name, $_arguments){
$action = substr($_name, 0, 4);
$varName = $this->callWhiteList[substr($_name, 4)];
if (!is_null($varName) && isset($this->{$varName})){
if ($action === "get_") return $this->{$varName};
if ($action === "set_") $this->{$varName} = $_arguments[0];
}
}
现在,您只能获取/设置“ foo”和“ fee”。
您还可以使用该“白名单”来分配自定义名称以访问您的var。
例如,
private $callWhiteList = array(
"myfoo" => "foo",
"zim" => "bom",
// ...
);
使用该列表,您现在可以键入:
class MyClass{
private foo = "bar";
private bom = "bim";
// ...
// private $callWhiteList = array( ... )
// public function __call(){ ... }
// ...
}
$C = new MyClass();
// as getter
$C->get_myfoo(); // return "bar"
$C->get_zim(); // return "bim"
// as setter
$C->set_myfoo("abc"); // set "abc" as new value of foo
$C->set_zim("zam"); // set "zam" as new value of bom
。
。
。
就这样。
Doc:
在对象上下文中调用不可访问的方法时会触发__call()。