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


170

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

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

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

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

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

जवाबों:


123

यह काफी दिलचस्प सवाल है - और जवाब भी दिलचस्प हो सकता है ^ ^

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

  • जहां प्रत्येक वस्तु अपने आप में डेटा हो (जैसे किसी उपयोगकर्ता का नाम हो) एक अस्थिर वर्ग का उपयोग करें
  • एक स्थिर वर्ग का उपयोग करें जब यह सिर्फ एक उपकरण है जो अन्य सामान पर काम करता है (जैसे, उदाहरण के लिए, HTML के लिए बीबी कोड के लिए एक सिंटैक्स कनवर्टर; इसका अपना कोई जीवन नहीं है)

(हाँ, मैं मानता हूँ, वास्तव में वास्तव में बहुत सरल ...)

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

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

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


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

1
उपयोगकर्ता के बारे में अच्छी तरह से बोलना, आपके पास प्रत्येक अनुरोध पर केवल एक सक्रिय उपयोगकर्ता है। इसलिए स्थैतिक उपयोगकर्ता के अनुरोध को स्थिर करने से समझदारी
आएगी

69

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

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

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

Miško Hevery , जो 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();

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

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

$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 एडाप्टर वर्ग का नाम निर्दिष्ट किया जा सके Zend_Db_Table। जब से मैंने इनका उपयोग किया है, तब से थोड़ी देर हो गई है, इसलिए यह अब प्रासंगिक नहीं हो सकता है, लेकिन यह है कि मुझे यह याद है।

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


1
@ नहीं, मुझे संदेह नहीं है कि एक बिट। मुझे एहसास है कि स्थिति / भूमिका में भी मूल्य है; हालाँकि, सब कुछ XP / एजाइल से संबंधित है, इसका वास्तव में फ़्लोज़ी नाम है।
जेसन

2
"निर्भरता इंजेक्शन" मेरा मानना ​​है कि इसके लिए अत्यधिक जटिल ध्वनि शब्द है। बहुत सारे और एसओ और गूगल-भूमि पर इस पर बहुत सारे पढ़ने। जहाँ तक "सिंगलटन" जाना है, यहाँ कुछ ऐसा है जिसने मुझे वास्तव में सोचने पर मजबूर कर दिया है: स्लाइडशेयर.नेट / ओगो_हो / ... इस बात पर कि पीएचपी सिंगलटन वास्तव में कोई मतलब नहीं रखते हैं। आशा है कि यह एक पुराने प्रश्न में थोड़ा योगदान देता है :)
dudewad

22

तो 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.
    }
}

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

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


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

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


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

यह सबसे ज्यादा पूछे जाने वाले PHP प्रश्न का सबसे अच्छा व्यावहारिक (बनाम सैद्धांतिक) उत्तरों में से एक है, परिशिष्ट बहुत मददगार है। मुझे लगता है कि यह एक उत्तर है कि बहुत सारे PHP प्रोग्रामर मांग रहे हैं, अपवित्र हैं!
ऐजवेवे

14

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

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


13

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

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

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

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

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

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

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

इस मामले में एक स्थिर वर्ग का विकल्प गड़बड़ है। आप नहीं चाहेंगे कि हर वर्ग को 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

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

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


क्या आप नीचे दिए गए बिंदु का एक उदाहरण लिख सकते हैं "आपके कोड के भाग किसी भी अन्य भागों के साथ वर्ग चर साझा नहीं कर सकते हैं" #JG एस्टियोट
khurshed alam

10

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

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

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

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

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


2
"कक्षा की तात्कालिकता को रोकने के लिए, कोई इसे अमूर्त घोषित कर सकता है," - मुझे यह बहुत पसंद है। मैंने पहले __construct () एक निजी फ़ंक्शन बनाने वाले लोगों के बारे में पढ़ा था, लेकिन मुझे लगता है कि अगर मुझे कभी ज़रूरत पड़ती है, तो मैं निश्चित रूप से सार का उपयोग करूंगा
Kavi Siegel

7

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

एक अच्छा उदाहरण 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);

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

उदाहरण के लिए, यदि Db ऑब्जेक्ट पर 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'

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

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


6

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

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

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


3

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


3

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.