2012-02-08 25 views
5

मान लें कि आपके पास एक ऑब्जेक्ट है जो अद्वितीय है, और इसका उपयोग अन्य सभी वर्गों और कार्यों द्वारा किया जाता है ... $application जैसे कुछ।वैश्विक बनाम फ़ंक्शन बनाम स्थैतिक वर्ग विधि

आप अपने कार्यों में इस ऑब्जेक्ट को कैसे एक्सेस करेंगे?

  1. आप में से प्रत्येक कार्यों में एक वैश्विक चर का उपयोग कर:

    global $application; 
    $application->doStuff(); 
    
  2. एक समारोह बनाने, application() कि एक स्थिर चर में वस्तु को दर्शाता है और यह रिटर्न की तरह; तो हर जगह इस फ़ंक्शन का उपयोग आप वस्तु का उपयोग करने की जरूरत है: वस्तु का उपयोग करने की,

    application()->doStuff(); 
    
  3. एक सिंगलटन बात बनाने वस्तु वर्ग है जो केवल उदाहरण देता है अंदर एक स्थिर विधि की तरह है, और इस विधि का उपयोग:

    Application::getInstance()->doStuff(); 
    
  4. KingCrunch & skwee: प्रत्येक कार्य/वर्ग जहां की जरूरत है के लिए तर्क के रूप में आवेदन वस्तु दर्रा

    ... 
    public function __construct(Application $app, ...){ 
        .... 
    

यदि अन्य विकल्प हैं तो कृपया उन्हें पोस्ट करें। मैं सोच रहा हूं कि इनमें से कौन सा विकल्प सबसे कुशल/माना जाता है "सर्वोत्तम अभ्यास"।

+2

क्या आपके पास कोई विशिष्ट प्रश्न है, या आप सिर्फ एक सूची बनाना चाहते हैं? –

उत्तर

4

मैं इसे सभी आवश्यक तरीकों से पास कर दूंगा। अर्थात

function doFoo(Application $app) { 
    $app->doStuff(); 
} 

दोनों वैश्विक और सिंगलटन बुरा माना जाता है और बहुत ज्यादा अपने कोड बाँधती हैं और इस इकाई परीक्षण और अधिक कठिन बना देता है।

मैं अपने आवेदन करने के लिए वैश्विक राज्य को पेश करने की जरूरत है और मैं दिया वस्तु का एक उदाहरण होना चाहिए: एक नियम है जब आप, सिंगलटन उपयोग करने के लिए अनुमति दी जाती है अगर आप निम्नलिखित बयान का जवाब "हाँ" नहीं है और एक से अधिक उदाहरण होने आप सभी 3 भागों में हाँ का जवाब है, तो आप सिंगलटन का उपयोग कर सकते त्रुटि

का कारण होगा। किसी अन्य मामले में बस उन सभी तरीकों से सभी उदाहरणों को पास करें जिन्हें उनकी आवश्यकता है। आप उनमें से बहुत ज्यादा है, तो संदर्भ की तरह कुछ प्रयोग करने पर विचार

class Context { 
    public $application; 
    public $logger; 
    .... 
} 
======== 
$context = new Context(); 
$context->application = new Application(); 
$context->logger = new Logger(...); 
doFoo($context); 
======== 
function doFoo(Context $context) { 
    $context->application->doStuff(); 
    $context->logger->logThings(); 
} 

(आप ही टिककर खेल का उपयोग कर सकते/setters यदि आप डेटा की रक्षा या यह हेरफेर करने के लिए की जरूरत है या आप आलसी दीक्षा आदि का उपयोग करना चाहते हैं)।

शुभकामनाएं!

+0

2 (मेरे पास दिए गए ऑब्जेक्ट का एक उदाहरण होना चाहिए) सच है :) – Alex

+0

लेकिन एक से अधिक उदाहरण होने से प्रोग्राम में त्रुटि होगी? यह ए एंड बी बी एंड सी सी का तार्किक बयान है, आपके मामले बी में सत्य और ए और सी झूठा है, इसलिए कथन गलत है :) मैं वास्तव में ऐसी स्थिति के बारे में नहीं सोच सकता जहां इस कथन का उत्तर सत्य होगा। हो सकता है कि कुछ प्रकार के माइक्रो-नियंत्रक प्रोग्रामिंग करते समय मेरे पास एक सिंगल सीपीयू या ऐसा कुछ हो ... –

1

या इसे केवल उन लोगों को दें, जो इसमें रूचि रखते हैं। आपके द्वारा किए गए सभी सुझाव वैश्विक चर की तरह हैं, भले ही आप इसे 3 में से 2 प्रकारों में न कहें।

इससे पहले कि यह कहें: "आप संभव नहीं हैं, क्योंकि सब कुछ इसकी आवश्यकता है", शायद यह बहुत अधिक है, बहुत अधिक हो सकता है, और/या बहुत कुछ जानता है।

+0

यह सच है, मैं एप्लिकेशन को प्रत्येक कक्षा के __construct के लिए तर्क के रूप में पास कर सकता हूं जहां मुझे इसकी आवश्यकता थी। लेकिन मुझे नहीं पता ... उस वर्ग के अंदर '$ this-> एप्लिकेशन' का उपयोग करना अजीब – Alex

+0

जैसा दिखता है, मुझे भी कक्षा के प्रत्येक स्थैतिक तरीके से उस तर्क को पास करना होगा ... – Alex

+0

'$ this- > प्रॉपर्टी 'बिल्कुल निर्भर करती है कि निर्भरता तक पहुंच कैसे दिखनी चाहिए। आपकी दूसरी टिप्पणी के बारे में: लगता है कि आपके पास बहुत अधिक स्थिर विधियां भी हैं। – KingCrunch

4

सिंगलेट्स, गॉड क्लासेस, मोनोलिथिक क्लासेस इत्यादि सभी विरोधी पैटर्न हैं, इसलिए मैं चौथा विकल्प सुझाऊंगा: निर्भरता इंजेक्शन। आप कारखाने के माध्यम से अपने आवेदन में application का उदाहरण बना सकते हैं (या शायद new यदि इसकी कोई निर्भरता नहीं है, लेकिन यह बाद में जटिल चीजों को समाप्त कर सकती है)।

फिर, application तक पहुंच की आवश्यकता वाले किसी भी वर्ग को इसे निर्माता के रूप में सहायक रूप से सदस्य के रूप में प्राप्त किया जा सकता है। मुझे यकीन है कि प्रत्येक वर्ग को application तक पहुंच की आवश्यकता है। डेमेटर के कानून को याद रखें।

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

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