ऐसा करने के कुछ तरीके हैं। वैश्विक चर निश्चित रूप से एक तरीका है और सबसे ज्यादा देखा भी जाता है। आप एक Singleton बना सकते हैं और अन्य सभी वर्ग जिन्हें डेटाबेस एक्सेस की आवश्यकता है, इस सिंगलटन पर कॉल करेंगे।
final class Database {
private static $connection;
public static function getInstance() {
if(self::$connection == NULL) {
self::$connection = // init your database connection
}
return self::$connection;
}
}
और इस डेटाबेस कनेक्शन ऑब्जेक्ट का उपयोग किसी भी वर्ग को इसकी आवश्यकता है।
class Application {
public function displayVar() {
echo 'hello world';
}
public function getVar() {
$db = Database::getInstance();
$sql = foo;
$db->query($sql);
}
}
यह एक शुरुआत के लिए ठीक है और वैश्विक चर का उपयोग करने से परे एक महान कदम है, लेकिन आप निर्भरता इंजेक्शन . निर्भरता इंजेक्शन एक सरल अवधारणा है कि यदि किसी वर्ग की कोई बाहरी निर्भरता है, जैसे कि आपके उदाहरण में डेटाबेस कनेक्शन, तो आप स्पष्ट रूप से जरूरतमंद वर्ग को इसके निर्माता या एक विधि में पास करते हैं। तो नया कोड जोनाथन के समाधान जैसा कुछ दिखाई देगा। डिपेंडेंसी इंजेक्शन का उपयोग करने का एक बड़ा फायदा यूनिट टेस्टिंग में है, जहां आप इस वास्तविक डेटाबेस ऑब्जेक्ट को आसानी से नकली ऑब्जेक्ट से बदल सकते हैं और इसे किसी को भी पास कर सकते हैं।
class Application {
private $db;
public function __construct(Database $db) {
$this->db = $db;
}
public function displayVar() {
echo 'hello world';
}
public function getVar() {
$sql = foo;
$this->db->query($sql);
}
}
छोटी परियोजनाओं के लिए, आप इसे आसानी से स्वयं कर सकते हैं। बड़ी परियोजनाओं के लिए, विभिन्न PH के लिए उपलब्ध DI फ्रेमवर्क हैं