2014-10-29 16 views
6

यह सुनिश्चित नहीं है कि इसे बिल्कुल कैसे शीर्षक दें। जबकि Laravel 4 वर्गों में खुदाई कैसे Facades काम को देखने के लिए, मैं इस पर ठोकर खाई:PHP लैरावेल फेकाडे __callStatic तर्क सूची

Illuminate\Support\Facades\[email protected]__callStatic 

public static function __callStatic($method, $args) 
{ 
    $instance = static::getFacadeRoot(); 

    switch (count($args)) 
    { 
     case 0: 
      return $instance->$method(); 

     case 1: 
      return $instance->$method($args[0]); 

     case 2: 
      return $instance->$method($args[0], $args[1]); 

     case 3: 
      return $instance->$method($args[0], $args[1], $args[2]); 

     case 4: 
      return $instance->$method($args[0], $args[1], $args[2], $args[3]); 

     default: 
      return call_user_func_array(array($instance, $method), $args); 
    } 
} 

अब मैं क्या इस विधि बता सकते हैं से वर्ग के किसी भी विधि फसाड संदर्भ कॉल करता है और साथ बहस से गुजरता है। मैं गलत हो सकता था लेकिन अब तक मेरी समझ है।

वह हिस्सा जो वास्तव में मुझे खराब करता है वह स्विच है।

डिफ़ॉल्ट मामले पर ध्यान दिए बिना मामले 0 से 4 की आवश्यकता क्यों होती है।

भले ही कोई तर्क न हो तो 0 प्रकार का अर्थ समझ में आता है, उदाहरण के लिए केस 1-4 क्यों है और केवल 10 मामले जारी नहीं है। क्या इसके लिए कोई उचित तर्क है या क्या यह समयपूर्व अनुकूलन का मामला है?

उत्तर

4

मुझे संदेह है कि यह एक माइक्रो-अनुकूलन है। मुझे यह भी संदेह होगा कि इन स्थिर कॉलों में से अधिकांश को मुखौटे के लिए 4 या कम तर्क की आवश्यकता होगी, इस मामले में अधिकांश स्थिर कॉल डिफ़ॉल्ट मामले में नहीं पहुंचेंगे।

मैं से call_user_func_array पर मैनुअल प्रविष्टि में उपयोगकर्ताओं द्वारा जमा किए उद्धरण इस ढूँढने में सक्षम था 'उदाहरण पर कोई नहीं dot com':

आप में से जो प्रदर्शन पर विचार करने के लिए है कि के लिए: इसके बारे में 3 बार ले जाता है फ़ंक्शन को सीधे कथन के माध्यम से इस तरह से कॉल करने के लिए, इसलिए जब भी इस विधि से बचने के लिए व्यवहार्य हो, तो ऐसा करने का एक बुद्धिमान विचार है।

एक बहुत सरल बेंचमार्क कर भी इस की वैधता की पुष्टि करने लगता है। परिणामों में, 1 सीधे एक उदाहरण पर एक विधि को कॉल कर रहा है, 2 एक आवृत्ति विधि नाम को एक उदाहरण पर कॉल कर रहा है, और 3 call_user_func_array का उपयोग कर रहा है, और आउटपुट समय सेकंड में है। प्रत्येक दृष्टिकोण के लिए पुनरावृत्तियों की संख्या 1,000,000 है।

$ php test.php 
(1) total: 0.51281404495239 
(2) total: 0.51285219192505 
(3) total: 1.1298811435699 
$ php test.php 
(1) total: 0.49811697006226 
(2) total: 0.5209321975708 
(3) total: 1.1204349994659 
$ php test.php 
(1) total: 0.48825788497925 
(2) total: 0.51465392112732 
(3) total: 1.156769990921 

ऊपर परिणाम दर्शाते हैं कि call_user_func_array परहेज ऊपर स्थिर मुखौटा तरीकों के लिए कॉल कम से कम 2 का एक पहलू के आसपास से, जब तक स्थिर विधि 4 से अधिक तर्क गति सकता है।

क्यों 4 पैरामीटर का कटऑफ नंबर चुना गया था, केवल टेलर जानता है। लार्वा 4.0 के first commit के बाद से यह विधि (ज्यादातर) अपरिवर्तित रही है, और मुझे संदेह है कि यह कुछ मनमाने ढंग से है।

3

क्योंकि $instance->$method()रास्ताcall_user_func_array से तेज़ है।

यह देखते हुए कि कोड के इस टुकड़े को एक चक्र में कई बार बुलाया जा सकता है, इसे यथासंभव अनुकूलित करने के लिए समझ में आता है।

4

आप सही हैं, call_user_func_array();switch कथन का उपयोग किये बिना पूरी तरह से काम करता है। लेकिन, इस benchmark के अनुसार, यह बहुत धीमी गति से लगता है:

function html($value) 
{ 
    return htmlentities($value); 
} 

name   : diff  : total : description 
native   : 0.614219 : 0.613295 : htmlentities($value) 
literal_func : 0.745537 : 1.346594 : html($value) 
variable_func : 0.826048 : 2.162376 : $func($value) 
literal_method : 0.957708 : 3.127519 : $object->html($value) 
variable_method : 0.840837 : 3.970290 : $object->$func($value) 
call_func  : 1.006599 : 4.993930 : call_user_func($func, $value) 
call_object  : 1.193323 : 6.215677 : call_user_func((array($object, $func), $value) 
cufa_func  : 1.232891 : 7.320287 : call_user_func_array($func, array($value)) 
cufa_object  : 1.309725 : 8.769755 : call_user_func_array((array($object, $func), array($value) 

तो मूल रूप से यह केवल एक मुद्दा है जब आप call_user_func_array() बार का एक बहुत (इस Laravel में मामला है) का उपयोग हो जाता है। यही कारण है कि वे switch कथन का उपयोग करते हैं।

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