2009-07-18 11 views
6

मैं वर्तमान में ब्लॉग सिस्टम बना रहा हूं, जिसे मैं भविष्य में एक पूर्ण सीएमएस में बदलने की उम्मीद करता हूं।PHP वैश्विक वस्तुओं का उपयोग करने से कैसे बचें?

दो कक्षाएं/ऑब्जेक्ट्स हैं जो वैश्विक पहुंच (mysqli डेटाबेस कनेक्शन और एक कस्टम क्लास जो उपयोगी है कि उपयोगकर्ता लॉग इन है या नहीं) के लिए उपयोगी होगा।

मैं वैश्विक वस्तुओं का उपयोग किए बिना ऐसा करने का एक तरीका ढूंढ रहा हूं, और यदि संभव हो, तो हर बार जब भी उन्हें बुलाया जाता है तो ऑब्जेक्ट को पास नहीं किया जाता है।

उत्तर

13

आप वस्तुओं को स्टेटिक बना सकते हैं, तो आपके पास कहीं भी पहुंच हो सकती है। उदाहरण:

myClass::myFunction(); 

यह स्क्रिप्ट में कहीं भी काम करेगा। हो सकता है कि आप स्थैतिक वर्गों पर पढ़ना चाहें, और संभावित रूप से एक स्थिर वस्तु के अंदर एक नियमित कक्षा बनाने के लिए सिंगलटन कक्षा का उपयोग कर सकते हैं जिसका उपयोग कहीं भी किया जा सकता है।

विस्तारित

मुझे लगता है कि तुम क्या करने की कोशिश कर रहे हैं बहुत मैं क्या मेरी डीबी वर्ग के साथ क्या के समान है।

class myClass 
{ 
    static $class = false; 
    static function get_connection() 
    { 
     if(self::$class == false) 
     { 
      self::$class = new myClass; 
     } 
     return self::$class; 
    } 
    // Then create regular class functions. 
} 

क्या होता है आप कनेक्शन लेने के बाद, $ वस्तु = myClass :: get_connection() का उपयोग कर रहा है, आप कुछ भी समारोह नियमित रूप से करना सक्षम हो जाएगा।

$object = myClass::get_connection(); 
$object->runClass(); 

विस्तारित एक बार जब आप स्थिर घोषणाओं, तो आप सिर्फ get_connection फोन और एक चर के लिए वापसी मान देना है कि है। फिर शेष कार्यों में एक वर्ग के समान व्यवहार हो सकता है जिसे आपने $ class = new myClass (क्योंकि हमने यही किया है) के साथ बुलाया है। आप जो कुछ कर रहे हैं वह क्लासिक वैरिएबल को एक स्थिर वर्ग के अंदर संग्रहीत कर रहा है।

class myClass 
{ 
    static $class = false; 
    static function get_connection() 
    { 
     if(self::$class == false) 
     { 
      self::$class = new myClass; 
     } 
     return self::$class; 
    } 
    // Then create regular class functions. 
    public function is_logged_in() 
    { 
     // This will work 
     $this->test = "Hi"; 
     echo $this->test; 
    } 
} 

$object = myClass::get_connection(); 
$object->is_logged_in(); 
+0

हाय, आपके उत्तर के लिए धन्यवाद, क्या स्थिर वर्गों में चर को सहेजना संभव है। यानी कॉल फ़ंक्शन यह जांचने के लिए कि उपयोगकर्ता लॉग इन है या नहीं, और उसके बाद पेज में कई बार इस चर का उपयोग करें? –

+2

हां, एक स्थैतिक वर्ग के लिए वही काम करते हैं जो मैंने परिवर्तनीय $ वर्ग घोषित करने के लिए किया था। केवल एक चीज यह है कि आपके द्वारा उपयोग किए जाने वाले प्रत्येक चर को घोषित करने के लिए आपके पास है। –

+1

लेकिन, मैंने जो कोड दिया है, वह आपको नियमित रूप से नियमित रूप से नियमित कक्षा का उपयोग करने की अनुमति देता है। स्थैतिक भाग आपको इसे वैश्विक बनाने की बजाए कक्षा देता है। मैं थोड़ा और दिखाने के लिए संपादित करेंगे। –

1

ठीक है, अगर आप पहले से ही कुछ वस्तु है जिसके द्वारा आप ब्लॉग प्रणाली का उल्लेख है, तो आप इन वस्तुओं है कि में, रचना कर सकते हैं ताकि वे $blog->db() और $blog->auth() या जो कुछ भी कर रहे हैं।

+0

मैं कर सकता था, लेकिन ऑब्जेक्ट्स को ब्लॉग क्लास के बाहर भी एक्सेस करने की आवश्यकता होगी। –

8

आप वर्तमान में वैश्विक वस्तुओं को कन्स्ट्रक्टर में पास कर सकते हैं।

<?php 
    class Foo { 
    protected $m_db; 
    function __construct($a_db) { 
     $this->m_db = $a_db; 
    } 
    } 
?> 
3

मैंने हाल ही में हमारी कंपनी के सीएमएस के दूसरे संस्करण की तैयारी में अपने ढांचे को फिर से बदल दिया। I undid सामान्य वस्तुओं के साथ उन्हें बदलने के लिए मैंने जो चीजें बनाई हैं, उनमें से एक बड़ी मात्रा में स्थिर है। ऐसा करने में, मैंने बड़ी मात्रा में लचीलापन बनाया जो मुझे कोर फाइलों में जाकर और हैकिंग पर भरोसा करता था। अब मैं केवल स्थिर संरचनाओं का उपयोग करता हूं जब एकमात्र विकल्प वैश्विक कार्य होता है, जो केवल निम्न-स्तरीय कोर कार्यक्षमता से संबंधित होता है।

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

//bootstrap.php 

... 

// CONSTRUCT APPLICATION 

{  
    $Database = new Databases\Mysql(
     Constant::get('DATABASE_HOST'), 
     Constant::get('DATABASE_USER'), 
     Constant::get('DATABASE_PASSWORD'), 
     Constant::get('DATABASE_SCHEMA') 
    ); 

    $Registry  = new Collections\Registry; 
    $Loader  = new Loaders\Base; 
    $Debugger  = new Debuggers\Dummy; // Debuggers\Console to log debugging info to JavaScript console 

    $Application = new Applications\Base($Database, $Registry, $Loader, $Debugger); 
} 

... 

आप देख सकते हैं, मैं अपने आवेदन वस्तु है, जो मैं अन्य वस्तुओं के निर्माता में एक तर्क उन्हें इन "वैश्विक" जरूरतों को पहुँच प्रदान करने के रूप में प्रदान की कर सकते हैं बनाने के लिए विकल्पों में से सभी प्रकार की है।

डेटाबेस ऑब्जेक्ट स्वयं स्पष्टीकरणपूर्ण है। रजिस्ट्री ऑब्जेक्ट ऑब्जेक्ट के लिए कंटेनर के रूप में कार्य करता है, मैं एप्लिकेशन में कहीं और एक्सेस करना चाहता हूं। लोडर टेम्पलेट फ़ाइलों जैसे अन्य संसाधनों को लोड करने के लिए उपयोगिता के रूप में कार्य करता है। और डीबग आउटपुट को संभालने के लिए डीबगर है।

उदाहरण के लिए, मैं डेटाबेस क्लास को बदल सकता हूं जिसे मैं तुरंत चालू करता हूं और, voila मेरे पास SQLite डेटाबेस से कनेक्शन है। मैं डीबगर की श्रेणी बदल सकता हूं (जैसा कि नोट किया गया है) और अब मेरी सभी डीबग जानकारी मेरे जावास्क्रिप्ट कंसोल पर लॉग इन की जाएगी।

ठीक है, अब इस मुद्दे पर वापस जाएं। आप अन्य वस्तुओं को इस सब तक कैसे पहुंच सकते हैं? आप बस इसे कन्स्ट्रक्टर के लिए एक तर्क में पास करते हैं।

// still bootstrap.php 

... 

// DISPATCH APPLICATION 

{ 
    $Router = new Routers\Http($Application); 
    $Router->routeUri($_SERVER['REQUEST_URI']); 
} 

... 

इतना ही नहीं, लेकिन मेरा राउटर (या जो भी वस्तु मैं इसके साथ बना रहा हूं) भी अधिक लचीला है। अब मैं अपने आवेदन ऑब्जेक्ट को अलग-अलग कर सकता हूं, और मेरा राउटर तदनुसार अलग-अलग व्यवहार करेगा।

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