วันนี้ฉันกำลังคิดที่จะใช้ PHP เพื่อใช้ซิงเกิลตัน และฉันเห็นบทสรุปที่ค่อนข้างครอบคลุม - การใช้งานโหมดซิงเกิลตันหลายอย่างสรุปไว้ในนั้น:
PLAIN TEXTPHP:
class MyClass
-
อินสแตนซ์ $ แบบคงที่ส่วนตัว;
ซิงเกิลตันฟังก์ชันคงที่สาธารณะ ()
-
ถ้า (!isset(ตนเอง::$อินสแตนซ์)) {
$c = __คลาส__;
ตนเอง::$อินสแตนซ์ = ใหม่ $c;
-
กลับตัวเอง::$อินสแตนซ์;
-
}
โค้ดนี้ใช้งานไม่สะดวก เนื่องจากโดยทั่วไปจะสืบทอดมาจาก MyClass และ $c = __CLASS__ จะได้รับชื่อคลาสของคลาสพื้นฐานเสมอ ซึ่งไม่พร้อมใช้งาน เราสามารถพิจารณาค้นหาวิธีการนำไปใช้งานอื่นเท่านั้น
จากนั้นฉันเริ่มดู singleton ที่ถูกนำไปใช้ในวิธีการของฟังก์ชันในบทความ การนำไปใช้งานนั้นดีมาก ข้อเสียคือคลาสไม่สามารถสร้างอินสแตนซ์ด้วยพารามิเตอร์ได้ นี่คือเวอร์ชันของฉัน:
PLAIN TEXTPHP:
function getObj() {
คงที่ $obj = array();
$args = func_get_args();
ถ้า(ว่าง($args))
กลับเป็นโมฆะ;
$clazz = $args[0];
ถ้า(!is_object($obj[$clazz])) {
$cnt = จำนวน($args);
ถ้า($cnt> 1) {
สำหรับ($i = 1, $s = ''; $i <$cnt; $i++)
$s[] = '$args[' . $i ']';
eval('$obj[$clazz] = new $clazz(' . join(',', $s) . ');');
} อื่น {
$obj[$clazz] = $clazz ใหม่;
-
-
กลับ $obj[$clazz];
}
สามารถเรียกได้อย่างง่ายดายภายใต้ php5:
PLAIN TEXTPHP:
getObj('MyClass', $param1, $param2)->myMethod();
เวอร์ชันไร้เดียงสาก่อนหน้า:
การใช้งานโหมด monad อย่างง่าย (SINGLETON)