ฉันทำการทดลองโดยใช้เวทมนต์ __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" และ "ค่าธรรมเนียม" เท่านั้น
นอกจากนี้คุณยังสามารถใช้ "บัญชีขาว" นั้นเพื่อกำหนดชื่อที่กำหนดเองเพื่อเข้าถึง vars ของคุณ
ตัวอย่างเช่น,
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 ()จะถูกเรียกใช้เมื่อเรียกใช้เมธอดที่ไม่สามารถเข้าถึงได้ในบริบทของวัตถุ