Tôi đã thực hiện một thí nghiệm bằng phương pháp ma thuật __call. Không chắc chắn tôi có nên đăng nó không (vì tất cả các cảnh báo "KHÔNG SỬ DỤNG PHƯƠNG PHÁP TẠO" trong các câu trả lời và nhận xét khác) nhưng tôi sẽ để nó ở đây .. chỉ trong trường hợp ai đó thấy nó hữu ích.
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];
}
}
Chỉ cần thêm phương thức đó ở trên trong lớp của bạn, bây giờ bạn có thể gõ:
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
Bằng cách này, bạn có thể nhận / đặt mọi thứ trong lớp nếu nó tồn tại, nếu bạn chỉ cần một vài yếu tố cụ thể, bạn có thể sử dụng "danh sách trắng" làm bộ lọc.
Thí dụ:
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];
}
}
Bây giờ bạn chỉ có thể nhận / đặt "foo" và "phí".
Bạn cũng có thể sử dụng "danh sách trắng" đó để gán tên tùy chỉnh để truy cập vào các lọ của bạn.
Ví dụ,
private $callWhiteList = array(
"myfoo" => "foo",
"zim" => "bom",
// ...
);
Với danh sách đó, bây giờ bạn có thể gõ:
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
.
.
.
Đó là tất cả.
Doc:
__call () được kích hoạt khi gọi các phương thức không thể truy cập trong ngữ cảnh đối tượng.