2012-02-10 9 views
5

मैं mysql डेटाबेस से कनेक्ट करने के लिए सिंगलटन क्लास का उपयोग करने के लिए एक सरल बनाने की कोशिश कर रहा हूं और प्रश्न पूछता हूं, कोड ठीक काम करता है और मुझे इसके साथ कोई समस्या नहीं है, लेकिन जब से मैं ओओपी में नया हूं, मैं सोच रहा हूं चाहे यह बुरा अभ्यास है या नहीं।php सिंगलटन डेटाबेस कनेक्शन, क्या यह कोड खराब अभ्यास है?

यहाँ वर्ग

class Database { 
private $databaseName = 'dbname'; 
private $host = 'localhost'; 
private $user = 'user'; 
private $password = 'pass'; 
private static $instance; //store the single instance of the database 

private function __construct(){ 
    //This will load only once regardless of how many times the class is called 
    $connection = mysql_connect($this->host, $this->user, $this->password) or die (mysql_error()); 
    $db = mysql_select_db($this->databaseName, $connection) or die(mysql_error()); 
    echo 'DB initiated<br>'; 
} 

//this function makes sure there's only 1 instance of the Database class 
public static function getInstance(){ 
    if(!self::$instance){ 
     self::$instance = new Database(); 
    } 
    return self::$instance;  
} 

public function connect() { 
    //db connection 
} 
public function query($query) { 
    //queries 
    $sql = mysql_query($query) or die(mysql_error()); 
    return $sql; 
} 

public function numrows($query) { 
    //count number of rows 
    $sql = $this->query($query); 
    return mysql_num_rows($sql); 
} 


} 

//Intantiate the class 
$database = Database::getInstance(); 

है और मैं क्या करना होगा जब मैं कक्षा उपयोग करना चाहते हैं:

$query = "SELECT * FROM registrations"; 
echo $database->numrows($query); 
$sql = $database->query($query); 
+0

सिंगलटन पैटर्न अक्सर डेटाबेस क्लासेस, लॉगर्स, फ्रंट कंट्रोलर या अनुरोध और प्रतिक्रिया ऑब्जेक्ट्स में लागू किया जाता है। – diEcho

+0

मुझे इस – jere

+0

में कोई समस्या नहीं दिखाई देती है, वहां आप वहां देख सकते हैं वहां डीबी कक्षाएं हैं। यहां तक ​​कि कोडिनेटर जैसे ढांचे को देखने के लिए यहां देखें कि उनके डीबी वर्ग कैसे काम करते हैं। –

उत्तर

12

सिंगलेट्स बुरी खबरें हैं।

  • वे वैश्विक कार्यक्रम को एक कार्यक्रम में पेश करते हैं। अधिकांश प्रोग्रामर परिचित होना चाहिए कि क्यों वैश्विक स्थिति खराब है।
  • वे सिंगलटन और किसी भी वर्ग के बीच कसकर युग्मन शुरू करते हैं जो इसका उपयोग करता है। इसका मतलब है कि आप सिंगलटन का पुन: उपयोग किए बिना कक्षाओं को प्रश्न में पुन: उपयोग नहीं कर सकते हैं।
  • वे कक्षाओं का यूनिट परीक्षण करते हैं जो सिंगलटन पर समस्याग्रस्त है क्योंकि आप आसानी से सिंगलटन को नकली के साथ प्रतिस्थापित नहीं कर सकते हैं।
  • वे कोडिंग शैली को प्रोत्साहित करते हैं जहां कक्षाएं अपनी निर्भरताओं को हल करने का प्रयास करती हैं। यह बुरा है क्योंकि यह वर्ग की निर्भरताओं के संबंध में स्पष्टता को कम कर सकता है।
  • PHP में एक साझा कुछ भी वास्तुकला नहीं है, जिसका अर्थ है कि PHP सिंगलेट्स वास्तव में अकेले सिंगलटन नहीं हैं, किसी भी समय कई खुले अनुरोध (एक खुले अनुरोध के लिए) हो सकते हैं।
  • क्या होता है यदि आप अचानक बाद की तारीख में खोजते हैं कि आपको वास्तव में सिंगलटन द्वारा प्रदान किए जा रहे संसाधनों में से एक से अधिक की आवश्यकता है?

इसके बजाय यह एक और अधिक सामान्य परिदृश्य है, इसके बजाय आप उपरोक्त मुद्दों को हल करते हुए पर बेहतर दिख रहे हैं।

+0

क्या आप 'निर्भरता-इंजेक्शन' पर कुछ अच्छे लेख प्रदान कर सकते हैं और कुछ स्पष्टीकरण क्यों "डेटाबेस के लिए रजिस्ट्री" खराब विचार है? (मुझे पता है कि मैं इसे Google कर सकता हूं, लेकिन पुष्टि की गुणवत्ता और विश्वसनीय स्रोतों से कुछ) – Vyktor

+0

रजिस्ट्रियां ज्यादातर मामलों में सिंगलेट्स की तरह हैं (वैश्विक स्थिति, निर्भरताओं को हल करने वाले वर्गों को प्रोत्साहित करती हैं आदि)। डीआई के लिए, यदि आप Google की तरह हैं, तो वहां बहुत सारे लेख हैं। :) मेरा मानना ​​है कि सिम्फनी ढांचे के लिए प्रलेखन में PHP संदर्भ में DI की एक अच्छी अच्छी चर्चा शामिल है। – GordonM

+0

ऑटोलोडर क्लास के बारे में क्या, (मेरे उत्तर का विस्तार) 'प्राप्त करें ($ connName) '' configs/$ connName.ini' के साथ स्वचालित रूप से कनेक्शन प्रारंभ करेगा? मैं समझता हूं कि आपको "नियंत्रक" से कनेक्शन के साथ "मॉडल" प्रदान करना चाहिए और मॉडल को 'डीबीएस :: get (' export ') जैसे कुछ भी नहीं करना चाहिए, लेकिन डिफ़ॉल्ट कनेक्शन निर्दिष्ट करने में क्या गलत है? – Vyktor

0

यह पैटर्न ठीक हो जाएगा क्योंकि सिंगलटन केवल वर्तमान उपयोगकर्ता सत्र के लिए लागू होगा। निर्णय वास्तव में आपकी प्राथमिकता के अनुसार आता है। यदि आप उपयोगकर्ता के लिए तेज़ प्रदर्शन चाहते हैं तो आप प्रति उपयोगकर्ता अधिक डेटाबेस कनेक्शन की अनुमति देना चाहते हैं, लेकिन यदि आप सीमित करना चाहते हैं कि आपका डेटाबेस कितना मुश्किल हो जाता है तो सिंगलटन आपको सड़क का एक अच्छा मध्य प्रदान करता है।

+1

सिंगलेट्स बुरी खबरें हैं। उन्हें टालना चाहिए। – GordonM

+0

@ गॉर्डनएम, बहुत सच है। आपका वकील अधिक समझदार दीर्घकालिक समाधान है। – davidethell

2

मुझे लगता है कि एक कनेक्शन प्रबंधक के लिए एक सिंगलटन ठीक हो सकता है, लेकिन एक कनेक्शन के लिए नहीं।

आप कभी नहीं जानते कि आपको अपने विकास के एक विशिष्ट हिस्से के लिए अतिरिक्त कनेक्शन कब चाहिए। मान लें कि आपको दूरस्थ डेटाबेस के साथ सिंक्रनाइज़ेशन जोड़ने की आवश्यकता है।

एक कनेक्शन प्रबंधक (जो एकाधिक कनेक्शन प्रबंधित कर सकता है) एक सिंगलटन हो सकता है। एक कनेक्शन खुद; नहीं।

आप कनेक्शन प्रबंधक को "ड्राइवर्स" लोड करने में भी सक्षम होना चाहिए, ताकि आप एक MySQL कनेक्शन को इंस्टाल कर सकें और जिस दिन आपको msSQL, sqLite या किसी और चीज की आवश्यकता हो, तो आप आवश्यक ड्राइवर जोड़ सकेंगे ।

2

मैं कहूंगा कि यह कक्षा का उपयोग करने के तरीके पर निर्भर करता है। यदि आप डेटाबेस का उपयोग करना चाहते हैं तो Database::getInstance() पर कॉल करें, यह ओओ परिप्रेक्ष्य से बुरा है, क्योंकि यह टेस्टेबिलिटी को नुकसान पहुंचाता है। यदि आप इसे एक बार करते हैं और फिर उन ऑब्जेक्ट्स को उदाहरण देते हैं जिन्हें डेटाबेस के साथ काम करने की आवश्यकता होती है, तो सिंगलटन (लेकिन अभी भी अनावश्यक) का उपयोग करना इतना बुरा नहीं है।

मैं सुझाव है कि आप निर्भरता इंजेक्शन अवधारणा को देखने के लिए: http://misko.hevery.com/2008/11/11/clean-code-talks-dependency-injection/ या http://fabien.potencier.org/article/11/what-is-dependency-injection

0

केवल सकारात्मक तर्क मैं PHP में सिंगलटन डिजाइन पैटर्न के लिए सुना है एक डेवलपर हैं जो संयोजन के रूप में एक सिंगलटन डेटाबेस कनेक्शन कार्यान्वित से था एक Memcached वस्तु के साथ। मुझे वास्तव में कोड और प्रदर्शन को देखने का मौका नहीं मिला लेकिन वह एक सुसंगत तर्क प्रस्तुत करने में सक्षम था।

व्यक्तिगत रूप से मुझे विश्वास नहीं है कि सिंगलटन डिज़ाइन पैटर्न PHP के लिए बहुत प्रासंगिक है, जो काफी हद तक स्टेटलेस है (जैसा कि प्रत्येक अनुरोध में एक सिंगलटन होगा)।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^