สมมติว่าฉันต้องการมีชุดของวัตถุ ซึ่งแต่ละชุดควรมี ID เฉพาะของตัวเอง ไม่จำเป็นต้องมีอะไรหรูหรา แค่ตัวอักษรที่ระบุว่าเป็นวัตถุประเภทใด และตัวเลขที่ระบุว่าวัตถุเหล่านี้ถูกสร้างขึ้นมากี่ชิ้น เช่น a0, a1, b0, c0, c1, c2, c3 และอื่นๆ
แทนที่จะตั้งค่าตัวแปรโกลบอลเพื่อติดตามจำนวนอ็อบเจ็กต์แต่ละรายการที่มีอยู่แล้ว ฉันต้องการดำเนินการดังกล่าวกับคลาส ชอบเช่นนั้น:
class uniqueIDGenerator
{
private $numberAObjs;
private $numberBObjs;
private $numberCObjs;
public function generateID ($type) {
if($type === "A") {
return 'a' . (int) $this->$numberAObjs++;
} else if($type === "B") {
return 'b' . (int) $this->$numberBObjs++;
} else if($type === "C") {
return 'c' . (int) $this->$numberCObjs++;
}
}
}
class obj
{
private $id;
function __construct($type) {
$this->id = uniqueIDGenerator::generateID($type);
}
}
ปัญหาก็คือว่าหาก UniqueIDGenerator ไม่ได้เกิดขึ้นจริง ฟังก์ชัน GenerateID ของมันจะส่งคืนค่าเดียวกันสำหรับแต่ละประเภทเสมอ (เช่น a0, b0, c0 เป็นต้น) เนื่องจากตัวแปรส่วนตัวไม่ได้ถูกสร้างขึ้นในหน่วยความจำจริงๆ ในเวลาเดียวกัน การทำให้คุณสมบัติของ obj จะไม่ทำงาน เพราะทุกครั้งที่สร้าง obj มันจะมีอินสแตนซ์ของ IDGenerator ของตัวเอง ดังนั้นมันจะคืนค่า a0, b0, c0 เสมอ (สมมติว่ามันเรียกว่าเท่านั้น ครั้งเดียวในวิธีการของวัตถุนั้น) และอื่นๆ
ดูเหมือนว่าตัวเลือกเดียวคือการทำให้ UniqueIDGenerator เป็นอินสแตนซ์ระดับโลกของตัวเองเพื่อให้ Constructor ของ obj สามารถอ้างอิงได้ แต่ดูเหมือนว่าจะมีการเขียนโค้ดที่ไม่ดี มีวิธี OOP ที่ดีในการทำเช่นนี้ที่แยกวัตถุทั้งหมดออกจากกันและจัดระเบียบหรือไม่?
static
- person Pierre Emmanuel Lallemant   schedule 30.10.2013