2009-10-02 18 views
19

जावा जैसी भाषाओं में, अधिक भार इस तरह से इस्तेमाल किया जा सकता है:PHP फ़ंक्शन ओवरलोडिंग के लिए क्या है?

void test($foo, $bar){} 
int test($foo){} 

तो अगर आप बुलाया test() 2 के साथ बहस e.g test($x, $y);, पहले समारोह के नाम से जाना जाएगा। यदि आपने केवल 1 तर्क पारित किया है जैसे test($x);, दूसरा फ़ंक्शन कॉल किया जाएगा।

मैनुअल से ऐसा लगता है कि PHP 5 में ओवरलोडिंग है, लेकिन इसके लिए क्या है? मैं इस विषय पर मैनुअल को समझ नहीं पा रहा हूं ..

+0

भी देखें [क्यों पीएचपी समारोह से अधिक भार का समर्थन नहीं करता?] (http://programmers.stackexchange.com/a/190550/ 84,349)। –

+0

आप इस लिंक में अधिभार योग्य वर्ग का उपयोग कर सकते हैं: http://stackoverflow.com/questions/4697705/php-function-overloading/27231803#27231803 –

उत्तर

25

PHP's meaning of overloading जावा की तुलना में अलग है। PHP में, ओवरलोडिंग का अर्थ है कि आप some of the __magic methods, __get, __set, __call, __callStatic जैसे some of the __magic methods को लागू करके रनटाइम पर ऑब्जेक्ट सदस्यों को जोड़ने में सक्षम हैं। आप नए सदस्यों के साथ वस्तुओं को लोड करते हैं।

PHP में ओवरलोडिंग गतिशील गुण और तरीकों "बनाने" करने के लिए साधन प्रदान करता है। ये गतिशील इकाइयां जादू विधियों के माध्यम से संसाधित की जाती हैं, विभिन्न क्रिया प्रकारों के लिए कक्षा में स्थापित हो सकती है।

एक उदाहरण:

class Foo 
{ 
    public function __call($method, $args) 
    { 
     echo "Called method $method"; 
    } 
} 

$foo = new Foo; 

$foo->bar(); // Called method bar 
$foo->baz(); // Called method baz 

और वैसे, पीएचपी पीएचपी 4.3.0 के बाद से अधिक भार इस तरह का समर्थन करता है। केवल अंतर यह है कि PHP 5 से पहले के संस्करणों में आपको overload() फ़ंक्शन का उपयोग करके ओवरलोडिंग को स्पष्ट रूप से सक्रिय करना था।

+0

उस प्रकार के अधिभार के किसी भी संभावित फायदे क्या हो सकते हैं जिसका उदाहरण आपने दिया था? ?? –

+8

एक परिदृश्य जिसमें '__call()' बहुत उपयोगी साबित हुआ था जब मैंने मुद्रा परिवर्तक वर्ग बनाया था। '$ कनवर्टर-> कन्वर्ट (2,' यूरो ',' यूएसडी ') को कॉल करने के बजाय; आप वास्तव में '$ कनवर्टर-> convertEurToUsd (2);' कह सकते हैं, जो मेरी राय में अधिक पढ़ने योग्य है। आप मेरे स्रोतों पर एक नज़र डाल सकते हैं: http://github.com/igstan/php-utils/blob/master/tests/CurrencyConverterTest.php http://github.com/igstan/php-utils/blob/master/ src/CurrencyConverter.php –

+2

मैं अपने डेटाबेस में गतिशील LINQ- जैसे इंटरफ़ेस के लिए इस विधि का उपयोग करता हूं। तो मैं $ db-> चुनें ('टेबल') -> col_1 [$ value] -> col_2 [$ value] -> मर्ज करें ('col_1'); तो सभी __calls()। सही हैंडलिंग क्लास (यानी एसक्यूएल, फाइल, एक्सएमएल) के माध्यम से पारित हो जाओ। – null

14

आप, जावा में की तरह एक समारोह को ओवरलोड किसी भी तर्क निर्दिष्ट नहीं करते हैं और func_num_args और func_get_args फ़ंक्शन का उपयोग तर्क या बहस के लिए खुद को कि है कि कार्य करने के लिए पारित किए गए की संख्या प्राप्त करने के लिए करना चाहते हैं:

function test() { 
    $args = func_get_args(); 
    switch (count($args)) { 
     case 1: 
      // one argument passed 
      break; 
     case 2: 
      // two arguments passed 
      break; 
     default: 
      // illegal numer of arguments 
      break; 
    } 
} 
-1

पर एक समारोह लोड करने के लिए बस पैरामीटर के रूप में डिफ़ॉल्ट रूप से अशक्त पारित करते हैं,

class ParentClass 
{ 
    function mymethod($arg1 = null, $arg2 = null, $arg3 = null) 
    { 
    if($arg1 == null && $arg2 == null && $arg3 == null){ 
     return 'function has got zero parameters <br />'; 
    } 
    else{ 
     $str = ''; 
     if($arg1 != null) 
     $str .= "arg1 = ".$arg1." <br />"; 

     if($arg2 != null) 
     $str .= "arg2 = ".$arg2." <br />"; 

     if($arg3 != null) 
     $str .= "arg3 = ".$arg3." <br />"; 

     return $str; 
     } 
    } 
} 

// and call it in order given below ... 

$obj = new ParentClass; 

echo '<br />$obj->mymethod()<br />'; 
echo $obj->mymethod(); 

echo '<br />$obj->mymethod(null,"test") <br />'; 
echo $obj->mymethod(null,'test'); 

echo '<br /> $obj->mymethod("test","test","test")<br />'; 
echo $obj->mymethod('test','test','test'); 
संबंधित मुद्दे