Magento 2 वस्तु प्रबंधक कारखाने के माध्यम से तात्कालिक कक्षाएं


9

मैगनेटो 2 में ऑब्जेक्ट मैनेजर फैक्ट्री का उपयोग करके कक्षाओं को तत्काल किया जाता है \Magento\Framework\ObjectManager\Factory\Factory::create():।
अब तक गू। लेकिन ऐसा कुछ है जो मुझे यहां समझ में नहीं आता है।
यह जांचने के बाद कि क्या डीआई के लिए कंस्ट्रक्टर को पारित किए जाने वाले तर्कों में कोई परिपत्र संदर्भ नहीं हैं और तर्क निर्धारित किए जाने के बाद यह है ( $argsवे तर्क हैं जो कंस्ट्रक्टर को पारित किए जाने चाहिए):

    switch (count($args)) {
        case 1:
            return new $type($args[0]);
        case 2:
            return new $type($args[0], $args[1]);
        case 3:
            return new $type($args[0], $args[1], $args[2]);
        case 4:
            return new $type($args[0], $args[1], $args[2], $args[3]);
        case 5:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4]);
        case 6:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]);
        case 7:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6]);
        case 8:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7]);
        default:
            $reflection = new \ReflectionClass($type);
            return $reflection->newInstanceArgs($args);
    }

यह लंबा switchबयान क्यों है ? defaultशाखा से सीधे कोड का उपयोग क्यों नहीं करते ?
या case8 पर क्यों रोकते हैं ? 5 या 10 या 127 क्यों नहीं?


बहुत बिस्तर कोडिंग
किउल शाह

1
@KeyulShah। हो सकता है, लेकिन मुझे यकीन है कि इसके पीछे एक कारण है।
मेरियस

जवाबों:


11

कारण है प्रदर्शन। नए के माध्यम से तात्कालिकता प्रतिबिंब की तुलना में थोड़ा तेज है। अधिकांश कक्षाओं में 8 से कम तर्क होते हैं इसलिए यह स्विच अधिकांश मामलों को कवर करता है।

शायद इसे हटा दिया जाएगा।


1
जवाब के लिए धन्यवाद। मुझे कहना होगा कि मैं थोड़ा निराश हूं। मैं कुछ फैंसी की उम्मीद कर रहा था। :)
मेरियस

1
प्रदर्शन काफी अच्छा कारण नहीं है? :)
एंटोन क्रिल

3
इसके अलावा, यदि यह उत्तर से स्पष्ट नहीं है, तो किसी चीज़ में थोड़ा तेज़ कार्यान्वयन जो बहुत कुछ होता है (यानी किसी वस्तु को तत्काल करना) इसके बारे में अच्छी तरह से है।
एलन स्टॉर्म

1
@AntonKril। मैं कारणों के बारे में बात नहीं कर रहा था। मुझे उम्मीद थी कि जैसे "क्योंकि हम इसे इस तरह करते हैं, वैसे ही आपकी बीयर कभी गर्म नहीं होगी" या ऐसा ही कुछ। लेकिन मुझे लगता है कि "प्रदर्शन" इसे अभी के लिए करेगा। कृपया पास रहें। अन्य दार्शनिक प्रश्न अगले दिनों में अनुसरण करेंगे। :)
मेरियस

6

प्रदर्शन लाभ लगभग अदृश्य है। जब मैं 2 तरीकों से 1000000 ऑब्जेक्ट्स को इंस्टेंट करने की कोशिश करता हूं, तो इसका परिणाम यह है:

यहां छवि विवरण दर्ज करें

मैं Magento 2 बीटा और PHP संस्करण का उपयोग कर रहा हूं (नीचे देखें)

PHP 5.6.12-1 + deb.sury.org ~ भरोसेमंद + 1 (cli) कॉपीराइट (c) 1997-2015 PHP समूह Zend इंजन v2.6.0, कॉपीराइट (c) 1998-2015 Zend टेक्नोलॉजीज के साथ Zend OPcache v7.0.6 -देव, कॉपीराइट (c) 1999-2015, ज़ेड टेक्नोलॉजीज द्वारा Xdebug v2.3.2 के साथ, कॉपीराइट (c) 2002-2015, डेरिक रीथन्स द्वारा

इस परीक्षण को करने के लिए, मैंने इस स्क्रिप्ट का उपयोग किया


अच्छा ... एंटोन ने कहा "थोड़ा तेज" है। जो यह है :)। लेकिन वैसे भी ... प्रोफाइलिंग के लिए + 1।
मेरियस

यह कोड बहुत पहले जोड़ा गया था। यह PHP 5.3 पर परीक्षण किया गया था। बाद के संस्करणों में अंतर कम दिखाई देने लगा, इसलिए मैंने अपने उत्तर में उल्लेख किया कि बाद में इस कोड को हटाया जा सकता है।
एंटोन क्रिल

@AntonKril इसके बजाय, आपने इसे 15 मापदंडों तक पंप किया ? ;-)
फेबियन शेंगलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.