singletons
का उपयोग करना PHP में बुरा अभ्यास माना जाता है। मेरे अनुभव से उनके साथ सबसे अधिक समस्याग्रस्त मुद्दा यूनिट परीक्षण हैं। यह सुनिश्चित करना कठिन है कि सिंगलटन का परीक्षण करते समय दो परीक्षण स्वतंत्र होते हैं।
मैं डीबी ऑब्जेक्ट बनाने वाले कोड को "केवल एक उदाहरण मौजूद होना चाहिए" बाधा के लिए ज़िम्मेदारी सौंप दूंगा।
इसके अलावा मेरे लिए ऐसा लगता है कि अन्य भाषाओं के विपरीत PHP में सिंगलटन कैसे काम करते हैं, इस बारे में गलतफहमी है:यदि आपके पास उदाहरण के लिए 10.000 समवर्ती अनुरोध हैं, तो प्रत्येक अनुरोध एक अलग PHP प्रक्रिया या थ्रेड में चलता है, जिसका अर्थ है कि वे सभी का अपना होगा "सिंगलटन" का उदाहरण, एक से अधिक अनुरोध के लिए इस ऑब्जेक्ट का कोई साझाकरण नहीं है (सामान्य वेब बैकएंड परिदृश्यों में PHP चलाते समय)
PHP में कोई "कनेक्शन पूलिंग" नहीं है, लेकिन आप mysqli
. का उपयोग कर सकते हैं mysql के लिए लगातार कनेक्शन। इसे p:
. पास करके हासिल किया जा सकता है होस्टनाम के सामने mysqli बनाते समय। यह यहां मदद कर सकता है, लेकिन इसे सावधानी से संभालें (अर्थात पहले दस्तावेज़ीकरण पढ़ेंए> )
हालाँकि, केवल सिद्धांत के लिए, PHP में एक सिंगलटन को इस तथ्य के बारे में पता होना चाहिए कि कोई व्यक्ति clone
का उपयोग कर सकता है . मतलब आपके मामले में ऐसा करना संभव होगा:
$db = DB::getInstance();
$db2 = clone $db;
इससे बचने के लिए आप __clone()
. को लागू कर सकते हैं इस तरह की विधि:
public function __clone() {
throw new Exception("Can't clone a singleton");
}