매직 메소드 __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 () 은 객체 컨텍스트에서 접근 할 수없는 메소드를 호출 할 때 트리거됩니다.