दिलचस्प पोस्ट
कैसे एक JQuery घड़ी / टाइमर बनाने के लिए सर्वर-साइड में फिल्मों को चित्रित करने के लिए AWT और स्विंग का उपयोग करने वाला जावा ऐप को पोर्ट करना जावास्क्रिप्ट ऑब्जेक्ट: स्ट्रिंग के रूप में नाम से वैरिएबल प्रॉपर्टी एक्सेस करें मैं PHP में एक वेब पेज का HTML कोड कैसे प्राप्त करूं? से बचने के लिए jQuery का नुकसान एक अर्रे डुप्लिकेट करने के लिए जावास्क्रिप्ट सबसे तेज़ तरीका – स्लाइस बनाम लूप के लिए Django बाकी ढांचे, एक ही ModelViewSet में अलग serializers का उपयोग करें डिबगिंग करते समय विजुअल स्टूडियो को WcfSvcHost.exe लॉन्च करने के लिए कैसे रोकें? सी # में तीन फाइलों को सम्मिलित करने का सबसे तेज़ तरीका क्या होगा? MySQL गलत कुंजी देने वाली विदेशी कुंजी के साथ तालिकाओं का निर्माण: 150 Django रूपों में सीएसएस स्टाइल IPhone पर मेरे ऐप से आधिकारिक * सेटिंग * ऐप को कॉल करें अजगर: अलग-अलग रंगों में एक पंक्ति को कैसे साजि करें प्रोग्रामेटिक एसएमएस क्या मुझे स्ट्रटस 2 दृश्य परत में डेटाबेस रिकॉर्ड प्राप्त करना चाहिए?

स्थैतिक बनाम तत्काल कक्षाओं का उपयोग कब करना

PHP मेरी पहली प्रोग्रामिंग भाषा है स्थिर कक्षाओं बनाम तत्काल वस्तुओं का उपयोग करने के लिए मैं अपने सिर को काफी आसपास लपेट नहीं कर सकता

मुझे पता है कि आप डुप्लिकेट और क्लोन ऑब्जेक्ट कर सकते हैं। हालांकि php का उपयोग करते हुए अपने सभी समय में कोई भी ऑब्जेक्ट या फंक्शन हमेशा एक रिटर्न (एरे, स्ट्रिंग, इन्ट) वैल्यू या शून्य के रूप में समाप्त होता है।

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

एक सरल उदाहरण एक ब्लॉग। किसी ब्लॉग की वस्तुओं को स्थैतिक या तत्काल वस्तु के रूप में सर्वश्रेष्ठ रूप से लागू किया जाएगा? डीबी वर्ग? वैश्विक दायरे में डीबी ऑब्जेक्ट को सिर्फ इन्स्तांत क्यों न करें? क्यों नहीं हर ऑब्जेक्ट स्थिर बनाये? प्रदर्शन के बारे में क्या?

यह सब सिर्फ शैली है? क्या यह सब करने के लिए एक उचित तरीका है?

वेब के समाधान से एकत्रित समाधान "स्थैतिक बनाम तत्काल कक्षाओं का उपयोग कब करना"

यह काफी दिलचस्प सवाल है – और उत्तर भी दिलचस्प हो सकते हैं ^^

चीजों पर विचार करने का सरल तरीका हो सकता है:

  • एक instanciated वर्ग का उपयोग करें, जहां प्रत्येक ऑब्जेक्ट का डेटा स्वयं का होता है (जैसे उपयोगकर्ता का नाम है)
  • एक स्थिर वर्ग का उपयोग करें जब यह केवल एक टूल होता है जो अन्य सामानों पर कार्य करता है (जैसे, उदाहरण के लिए, बी.बी. कोड को एचटीएमएल के लिए एक सिंटैक्स कनवर्टर, इसकी अपनी कोई ज़िंदगी नहीं है)

(हाँ, मैं मानता हूँ, वास्तव में बहुत अधिक सरलीकृत …)

स्थिर तरीकों / वर्गों के बारे में एक बात यह है कि वे यूनिट परीक्षण की सुविधा नहीं देते (कम से कम PHP में हैं, लेकिन शायद अन्य भाषाओं में भी)।

स्थिर डेटा के बारे में एक अन्य चीज यह है कि आपके कार्यक्रम में केवल इसका एक उदाहरण मौजूद है: यदि आप कुछ मूल्य के लिए MyClass :: $ myData सेट करते हैं, तो इसका मान होगा, और केवल यह, हर जगह – उपयोगकर्ता के बारे में बोलना, आप केवल एक ही उपयोगकर्ता में सक्षम होंगे – जो कि महान नहीं है, है ना?

ब्लॉग सिस्टम के लिए, मैं क्या कह सकता हूं? वहाँ ज्यादा नहीं है मैं वास्तव में स्थिर के रूप में लिखूंगा, मुझे लगता है; शायद डीबी-एक्सेस क्लास, लेकिन संभवतः अंत ^^ में नहीं

स्थिर तरीकों का उपयोग करने के मुख्य कारण हैं:

  • स्थिर तरीकों का उपयोग कर परीक्षण करना कठिन है
  • स्थिर विधियों का उपयोग करने के लिए कोड का विस्तार करना कठिन है

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

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

इसलिए होने के बजाय:

 class HttpClient { public function request() { return HttpResponse::build(); } } 

हमें इसे करना चाहिए:

 class HttpClient { private $httpResponseFactory; public function __construct($httpResponseFactory) { $this->httpResponseFactory = $httpResponseFactory; } public function request() { return $this->httpResponseFactory->build(); } } 

और फिर, सूचकांक / मुख्य पृष्ठ में, हम चाहते हैं (यह ऑब्जेक्ट वॉरिंग चरण है, या प्रोग्राम द्वारा उपयोग किए जाने वाले उदाहरणों का ग्राफ बनाने का समय):

 $httpResponseFactory = new HttpResponseFactory; $httpClient = new HttpClient($httpResponseFactory); $httpResponse = $httpClient->request(); 

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

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

 $db = new DbConnection; $users = new UserCollection($db); $posts = new PostCollection($db); $comments = new CommentsCollection($db); 

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

 /** * An example of a test using PHPUnit. The point is to see how easy it is to * pass the UserCollection constructor an alternative implementation of * DbCollection. */ class UserCollection extends PHPUnit_Framework_TestCase { public function testGetAllComments() { $mockedMethods = array('query'); $dbMock = $this->getMock('DbConnection', $mockedMethods); $dbMock->expects($this->any()) ->method('query') ->will($this->returnValue(array('John', 'George'))); $userCollection = new UserCollection($dbMock); $allUsers = $userCollection->getAll(); $this->assertEquals(array('John', 'George'), $allUsers); } } 

एकमात्र ऐसी स्थिति जहां मैं इस्तेमाल कर रहा था (और मैंने उन्हें PHP 5.3 में जावास्क्रिप्ट प्रोटोटाइप ऑब्जेक्ट की नकल करने के लिए उपयोग किया है) स्थैतिक सदस्य हैं, जब मुझे पता है कि संबंधित फ़ील्ड में समान मूल्य क्रॉस-इंस्टेंस होगा उस समय आप एक स्थैतिक संपत्ति का उपयोग कर सकते हैं और शायद एक स्थिर जोड़ीदार / सेटर विधियों की एक जोड़ी। फिर भी, स्थिर सदस्य को एक उदाहरण के सदस्य के साथ ओवरराइड करने की संभावना जोड़ने के लिए मत भूलना। उदाहरण के लिए, ज़ेंड फ़्रेमवर्क एक स्थैतिक संपत्ति का उपयोग कर रहा था ताकि Zend_Db_Table उदाहरणों में उपयोग किए जा Zend_Db_Table वाले डीबी एडाप्टर क्लास का नाम निर्दिष्ट किया जा Zend_Db_Table । यह थोड़ी देर हो चुकी है क्योंकि मैंने उनका इस्तेमाल किया है, इसलिए यह अब प्रासंगिक नहीं हो सकता है, लेकिन मैं इसे याद करता हूं।

स्थैतिक तरीकों जो स्थिर गुणों के साथ सौदा नहीं करते हैं उन्हें कार्य करना चाहिए। PHP में फ़ंक्शन हैं और हमें उनका उपयोग करना चाहिए।

तो फ़ैक्ट्री स्टैटिक में फ़ंक्शन या वेरिएबल पर लागू किया जा सकता है। गैर-स्थिर चर वर्ग की एक विशिष्ट उदाहरण से जुड़ी हैं। गैर-स्थिर विधियां एक क्लास के उदाहरण पर कार्य करती हैं तो चलो एक BlogPost नामक एक वर्ग बनाओ।

title एक गैर-स्थिर सदस्य होगा इसमें उस ब्लॉग पोस्ट का शीर्षक है हमारे पास find_related() नामक एक विधि हो सकती है यह स्थिर नहीं है क्योंकि इसमें ब्लॉग पोस्ट क्लास के एक विशिष्ट उदाहरण की जानकारी आवश्यक है

इस श्रेणी में ऐसा कुछ दिखाई देगा:

 class blog_post { public $title; public $my_dao; public function find_related() { $this->my_dao->find_all_with_title_words($this->title); } } 

दूसरी तरफ, स्थिर कार्यों का उपयोग करके, आप इस तरह एक वर्ग लिख सकते हैं:

 class blog_post_helper { public static function find_related($blog_post) { // Do stuff. } } 

इस मामले में, क्योंकि फ़ंक्शन स्थिर है और किसी विशेष ब्लॉग पोस्ट पर कार्य नहीं कर रहा है, आपको ब्लॉग पोस्ट में तर्क के रूप में पास करना होगा।

मौलिक रूप से यह ऑब्जेक्ट ओरिएंटेड डिज़ाइन के बारे में एक सवाल है। आपकी कक्षाएं आपके सिस्टम में संज्ञाएं हैं, और जो क्रियाएं उन पर कार्य करती हैं वह verbs हैं स्थिर कार्य प्रक्रियात्मक हैं आप फ़ंक्शन के ऑब्जेक्ट में तर्क के रूप में पास करते हैं।


अद्यतन: मैं यह भी जोड़ूंगा कि यह निर्णय शायद ही कभी तरीकों और स्थिर तरीकों के बीच होता है, और कक्षाओं का उपयोग करने और साहचर्य सरणियों का उपयोग करने के बीच अधिक होता है उदाहरण के लिए, एक ब्लॉगिंग ऐप में, आप या तो डेटाबेस से ब्लॉग पोस्ट पढ़ सकते हैं और उन्हें ऑब्जेक्ट में कनवर्ट करते हैं, या आप उन्हें परिणाम सेट में छोड़ देते हैं और उन्हें एसोसिएटिव एरे के रूप में मानते हैं। फिर आप फ़ंक्शन लिखते हैं जो एसोसिएटिव एरेज़ या एसोसिएटिव एरेज़ की सूचियों को तर्क के रूप में लेते हैं।

ओ ओ परिदृश्य में, आप अपने BlogPost वर्ग पर तरीकों को लिखते हैं जो व्यक्तिगत पदों पर कार्य करते हैं, और आप स्थिर तरीके लिखते हैं जो पदों के संग्रह पर कार्य करते हैं

यह सब सिर्फ शैली है?

एक लंबा रास्ता, हाँ आप स्थायी सदस्यों का उपयोग किए बिना पूरी तरह से अच्छे ऑब्जेक्ट ओरिएंटेड प्रोग्राम लिख सकते हैं। वास्तव में कुछ लोग तर्क देंगे कि स्थिर सदस्य पहले स्थान पर अशुद्ध हैं। मैं सुझाव दूंगा – ओप में शुरुआत के रूप में – आप स्थिर सदस्यों को एक साथ सभी से बचने की कोशिश करते हैं। यह आपको प्रक्रियात्मक शैली के बजाय किसी ऑब्जेक्ट में लिखने की दिशा में बल देगा

"किसी अन्य विधि के अंदर एक स्थैतिक विधि कॉल होने से वास्तव में एक वैश्विक चर आयात करने से भी बुरा होता है।" (परिभाषित "बदतर") … और "स्थैतिक तरीकों जो स्थिर गुणों के साथ सौदा नहीं करते हैं वे कार्य होनी चाहिए"।

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

  • उन्हें सभी नामस्थान दें – किसी भी नाम संघर्ष से बचें
  • एक प्रोजेक्ट में बिखरे हुए होने के बजाय उन्हें शारीरिक रूप से स्थित रहें – अन्य डेवलपर्स आसानी से उस चीज़ को आसानी से पा सकते हैं जो पहले से उपलब्ध है और पहिया का फिर से आविष्कार करने की संभावना कम है
  • मुझे किसी भी जादू मूल्यों के लिए वैश्विक परिभाषित करने के बजाय वर्ग consts का उपयोग करें

यह उच्च संलयन और निचले युग्मन को लागू करने के लिए बस एक सुविधाजनक तरीका है

और एफडब्ल्यूआईडब्ल्यू- कम से कम PHP5 में "स्थिर वर्ग" जैसी कोई चीज नहीं है; विधियों और गुण स्थिर हो सकते हैं वर्ग के तात्कालिकता को रोकने के लिए, आप इसे सार भी घोषित कर सकते हैं।

मेरे पास अधिकांश उत्तर के लिए एक अलग दृष्टिकोण है, खासकर जब PHP का उपयोग करना। मुझे लगता है कि सभी कक्षाएं स्थिर होनी चाहिए, जब तक आपके पास कोई अच्छा कारण न हो। कुछ "क्यों नहीं" कारण हैं:

  • आपको कक्षा के कई उदाहरणों की आवश्यकता है
  • आपके वर्ग को विस्तारित करने की आवश्यकता है
  • आपके कोड के भाग किसी भी अन्य भागों के साथ वर्ग चर को साझा नहीं कर सकते

मुझे एक उदाहरण लेना चाहिए। चूंकि हर PHP स्क्रिप्ट HTML कोड उत्पन्न करता है, मेरे ढांचे में एक html लेखक वर्ग होता है। यह सुनिश्चित करता है कि कोई अन्य वर्ग एचटीएमएल लिखने का प्रयास करेगा क्योंकि यह विशेष कार्य है जिसे एक वर्ग में केंद्रित किया जाना चाहिए।

आमतौर पर, आप इस तरह HTML वर्ग का प्रयोग करेंगे:

 html::set_attribute('class','myclass'); html::tag('div'); $str=html::get_buffer(); 

हर बार get_buffer () को बुलाया जाता है, यह सब कुछ रीसेट करता है ताकि अगले लेखक html लेखक का उपयोग करने वाले एक ज्ञात राज्य में शुरू हो जाए।

मेरे सभी स्थैतिक वर्गों में एक init () फ़ंक्शन है जिसे क्लास को पहली बार उपयोग करने से पहले कहा जाना चाहिए यह एक आवश्यकता से अधिक सम्मेलन के द्वारा अधिक है

इस मामले में एक स्थिर वर्ग के विकल्प गंदा है। आप चाहते हैं कि हर वर्ग को HTML के एक छोटे से बिट को लिखने की आवश्यकता न हो, ताकि HTML लेखक का एक उदाहरण हो सके।

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

 $form = new form(stuff here); $form->add(new text(stuff here)); $form->add(new submit(stuff here)); $form->render(); // Creates the entire form using the html class 

ऐसा कोई तरीका नहीं है जिससे आप यह स्थिर कक्षाओं के साथ कर सकते हैं, विशेष रूप से प्रत्येक अतिरिक्त वर्ग के कन्स्ट्रक्टर के बहुत सारे काम करते हैं इसके अलावा, सभी तत्वों के लिए विरासत की श्रृंखला काफी जटिल है। तो यह एक स्पष्ट उदाहरण है, जहां स्थिर कक्षाओं का उपयोग नहीं किया जाना चाहिए।

ज्यादातर उपयोगिता वर्ग जैसे कि कनवर्टिंग / स्ट्रिंगिंग स्ट्रिंग्स एक स्थिर वर्ग होने के लिए अच्छे उम्मीदवार हैं। मेरा नियम सरल है: PHP में सब कुछ स्थिर हो जाता है, जब तक कि एक कारण यह नहीं होना चाहिए।

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

एक अच्छा उदाहरण ORM या डेटाबेस अमूर्त परत होगा। आपके पास एकाधिक डेटाबेस कनेक्शन हो सकते हैं

 $db1 = new Db(array('host' => $host1, 'username' => $username1, 'password' => $password1)); $db2 = new Db(array('host' => $host2, 'username' => $username2, 'password' => $password2)); 

ये दो कनेक्शन अब स्वतंत्र रूप से काम कर सकते हैं:

 $someRecordsFromDb1 = $db1->getRows($selectStatement); $someRecordsFromDb2 = $db2->getRows($selectStatement); 

अब इस पैकेज / लाइब्रेरी के भीतर, अन्य श्रेणियां भी हो सकती हैं जैसे कि डीबी_रो, आदि। किसी विशेष पंक्ति का प्रतिनिधित्व करने के लिए एक चयन कथन से वापस आती है। यदि यह Db_Row वर्ग एक स्थैतिक वर्ग था, तो यह मान लेगा कि आपको एक डाटाबेस में डेटा की केवल एक पंक्ति है और ऐसा करना असंभव होगा जो एक ऑब्जेक्ट उदाहरण हो। एक उदाहरण के साथ, अब असीमित संख्या में डेटाबेस में असीमित संख्या में पंक्तियों की एक असीमित संख्या हो सकती है केवल सीमा सर्वर हार्डवेयर है;)।

उदाहरण के लिए, यदि डीबी ऑब्जेक्ट पर getRows विधि Db_Row ऑब्जेक्ट की एक सरणी देता है, तो अब आप प्रत्येक पंक्ति पर स्वतंत्र रूप से एक दूसरे पर काम कर सकते हैं:

 foreach ($someRecordsFromDb1 as $row) { // change some values $row->someFieldValue = 'I am the value for someFieldValue'; $row->anotherDbField = 1; // now save that record/row $row->save(); } foreach ($someRecordsFromDb2 as $row) { // delete a row $row->delete(); } 

एक स्थिर वर्ग का एक अच्छा उदाहरण कुछ होगा जो रजिस्ट्री चर, या सत्र चर संभालता है क्योंकि केवल एक रजिस्ट्री या प्रति उपयोगकर्ता एक सत्र होगा

आपके आवेदन के एक भाग में:

 Session::set('someVar', 'toThisValue'); 

और एक अन्य भाग में:

 Session::get('someVar'); // returns 'toThisValue' 

चूंकि एक सत्र में केवल एक उपयोगकर्ता होने वाला है, सत्र के लिए एक उदाहरण बनाने में कोई बात नहीं है।

मुझे आशा है कि यह मदद करता है, अन्य उत्तरों के साथ-साथ चीजों को साफ करने में सहायता करें एक तरफ नोट के रूप में, " संयोग " और " युग्मन " को देखें वे कुछ बहुत, बहुत अच्छे अभ्यास का वर्णन करते हैं, जब आपके कोड लिखते हैं जो सभी प्रोग्रामिंग भाषाओं पर लागू होते हैं।

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

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

और हां, यह कई अन्य कारणों में से केवल एक है, जिनमें से कुछ पहले ही उल्लेख किए गए हैं।

सामान्य तौर पर, आपको सदस्य चर और सदस्य कार्यों का उपयोग करना चाहिए, जब तक कि वह सभी उदाहरणों के बीच साझा न करें या जब तक आप सिंगलटन नहीं बना रहे हों। सदस्य डेटा और सदस्य कार्यों का उपयोग करने से आप अपने कार्यों को कई अलग-अलग टुकड़ों के लिए पुन: उपयोग कर सकते हैं, जबकि आप केवल एक डेटा की प्रतिलिपि प्राप्त कर सकते हैं, जिस पर आप स्थिर डेटा और कार्यों का उपयोग करते हैं। इसके अतिरिक्त, हालांकि PHP, स्थिर कार्यों और डेटा पर लागू होने वाले कोड को गैर-रीएन्ट्रंट के रूप में लागू नहीं किया जाता है, जबकि क्लास डेटा रीट्रैन्सीसी की सुविधा देता है

मैं यह कहना चाहूंगा कि निश्चित रूप से एक ऐसा मामला है जहां मुझे क्रॉस-लैंग्वेज एप्लीकेशन में स्थिर वैरिएबल चाहिए। आपके पास एक ऐसा वर्ग हो सकता है जिसे आप किसी भाषा को (उदाहरण के लिए $ _SESSION ['भाषा']) पास करते हैं और इसके बदले में ऐसे अन्य वर्गों तक पहुंच जाते हैं, जो इस तरह से डिज़ाइन किए गए हैं:

 Srings.php //The main class to access StringsENUS.php //English/US StringsESAR.php //Spanish/Argentina //...etc 

स्ट्रिंग्स का उपयोग करना :: getString ("somestring") आपके आवेदन के बाहर अपनी भाषा के उपयोग को सार करने का एक अच्छा तरीका है। आप ऐसा कर सकते हैं, लेकिन आप कृपया, लेकिन इस मामले में प्रत्येक स्ट्रिंग फ़ाइल स्ट्रिंग मानों के साथ स्थिर होती हैं, जो स्ट्रिंग्स क्लास द्वारा उपयोग की जाती हैं, बहुत अच्छी तरह से काम करती है।