PHP फ़ंक्शन ओवरलोडिंग का समर्थन क्यों नहीं करता है?


37

मुझे आश्चर्य हो रहा है कि क्या किसी प्रोग्रामिंग लैंग्वेज की प्रमुख विशेषताओं में से एक में तर्कों के माध्यम से कार्यों को ओवरलोड करने की क्षमता है। मुझे लगता है कि यह वस्तु उन्मुख प्रोग्रामिंग के संदर्भ में आवश्यक है।

क्या यह जानबूझकर पीछे छोड़ दिया गया है और अनुमति नहीं है? या फिर ओवरलोडिंग एक अच्छा अभ्यास नहीं है?


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

2
@CharlesSalvia एक अच्छा जवाब होगा।
kiamlaluno

1
उसने क्या क़हा। इसके अलावा, कार्य अतिभारित है। आपको अलग-अलग फ़ंक्शन के लिए एक ही फ़ंक्शन नाम का उपयोग करने की आवश्यकता नहीं है; बस अपने कार्यों को नाम दें जो समान हैं लेकिन समान नहीं हैं। दूसरी ओर ओवरलोडिंग करने वाला ऑपरेटर ...
मिस्टर लिस्टर

हालांकि विशिष्ट प्रश्न का उत्तर नहीं है, मैं इस लिंक को पोस्ट करूंगा जिसने मुझे PHP में ओवरलोडिंग का उपयोग करने के लिए HOW को बेहतर ढंग से समझा। आशा है कि यह मदद करता है
डिएगो डीडी

जवाबों:


33

किसने आपको बताया कि PHP फ़ंक्शन ओवरलोडिंग का समर्थन नहीं करता है !!!

वास्तव में PHP फंक्शन ओवरलोडिंग का समर्थन करता है, लेकिन एक अलग तरीके से। PHP के ओवरलोडिंग फीचर्स जावा के अलग हैं:

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

निम्नलिखित कोड ब्लॉक चेकआउट करें।

N संख्याओं का योग खोजने का कार्य:

function findSum() {
    $sum = 0;
    foreach (func_get_args() as $arg) {
        $sum += $arg;
    }
    return $sum;
}

echo findSum(1, 2), '<br />'; //outputs 3
echo findSum(10, 2, 100), '<br />'; //outputs 112
echo findSum(10, 22, 0.5, 0.75, 12.50), '<br />'; //outputs 45.75

दो संख्याओं को जोड़ने या दो तारों को जोड़ने का कार्य:

function add() {
    //cross check for exactly two parameters passed
    //while calling this function
    if (func_num_args() != 2) {
        trigger_error('Expecting two arguments', E_USER_ERROR);
    }

    //getting two arguments
    $args = func_get_args();
    $arg1 = $args[0];
    $arg2 = $args[1];

    //check whether they are integers
    if (is_int($arg1) && is_int($arg2)) {
        //return sum of two numbers
        return $arg1 + $arg2;
    }

    //check whether they are strings
    if (is_string($arg1) && is_string($arg2)) {
        //return concatenated string
        return $arg1 . ' ' . $arg2;
    }

    trigger_error('Incorrect parameters passed', E_USER_ERROR);
}

echo add(10, 15), '<br />'; //outputs 25
echo add("Hello", "World"), '<br />'; //outputs Hello World

विधि ओवरलोडिंग सहित ऑब्जेक्ट ओरिएंटेड दृष्टिकोण:

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

Ref: http://php.net/manual/en/language.oop5.overloading.php

पीएचपी में, साधन अधिक भार आप रन-टाइम में वस्तु सदस्य जोड़ सकते हैं जैसे जादू तरीकों के कुछ को लागू करने से, __set, __get, __callआदि

class Foo {

    public function __call($method, $args) {

        if ($method === 'findSum') {
            echo 'Sum is calculated to ' . $this->_getSum($args);
        } else {
            echo "Called method $method";
        }
    }

    private function _getSum($args) {
        $sum = 0;
        foreach ($args as $arg) {
            $sum += $arg;
        }
        return $sum;
    }

}

$foo = new Foo;
$foo->bar1(); // Called method bar1
$foo->bar2(); // Called method bar2
$foo->findSum(10, 50, 30); //Sum is calculated to 90
$foo->findSum(10.75, 101); //Sum is calculated to 111.75

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

10
यह फ़ंक्शन ओवरलोडिंग नहीं है। किसी फ़ंक्शन को वास्तव में अधिभारित करने के लिए, अब php के बराबर लिखें findSum(10, "steve", { 86, "2012-09-20" });। एक सच्चा अधिभार विभिन्न प्रकारों के नए मापदंडों की अनुमति देगा।
जोएल एथरटन

3
@JoelEtherton - "ओवरलोडिंग" की PHP की व्याख्या अधिकांश वस्तु उन्मुख भाषाओं से अलग है। ओवरलोडिंग परंपरागत रूप से एक ही नाम के साथ कई तरीकों को करने की क्षमता प्रदान करता है लेकिन विभिन्न मात्रा और प्रकार के तर्क। Ref: http://php.net/manual/en/language.oop5.overloading.php PHP में ओवरलोडिंग गुणों और तरीकों को "बनाने" का अर्थ है। इन गतिशील संस्थाओं को जादू के तरीकों के माध्यम से संसाधित किया जाता है जो विभिन्न क्रिया प्रकारों के लिए एक वर्ग में स्थापित कर सकते हैं।
राजुकॉयलैंडि

7
@rajukoyilandy: यह सब ठीक है और अच्छा है, लेकिन ओपी का सवाल यह है कि PHP "पारंपरिक" ओवरलोडिंग को क्यों लागू नहीं करता है। आपका जवाब यह नहीं बताता है।
जोएल एथर्टन

7
यह ओवरलोडिंग नहीं है। फ़ंक्शन की केवल एक परिभाषा / घोषणा अभी भी है। यह C ++ में va_list / va_arg के बराबर होगा। क्या आप कुछ ऐसी ही समस्याओं को हल कर सकते हैं? हाँ। लेकिन यह अभी भी ओवरलोडिंग नहीं है।
ल्यूक

13

नहीं एक "पारंपरिक ओवरलोडिंग" पूर्ण समर्थन, केवल आंशिक

एक परिभाषा : "पारंपरिक ओवरलोडिंग", जब कॉलिंग विधि, एक ही नाम के साथ कई तरीकों की क्षमता है, लेकिन विभिन्न मात्रा और प्रकार के तर्क प्रदान करता है। विधि घोषणा के लिए , यह प्रत्येक अतिभारित फ़ंक्शन के लिए एक अलग / पृथक घोषणा व्यक्त करने का विकल्प प्रदान करता है।

नोट: इस परिभाषा का दूसरा भाग आमतौर पर सही घोषणा को चुनने के लिए सांख्यिकीय रूप से टाइप की गई प्रोग्रामिंग भाषाओं के साथ जुड़ा होता है जो टाइप चेकिंग और / या एरिटी चेकिंग करते हैं। PHP एक सांख्यिकीय-टाइप भाषा नहीं है, यह गतिशील है , और कमजोर टाइपिंग का उपयोग करें


PHP समर्थन :

  • हाँ, एक ही नाम पर विभिन्न मात्राओं के साथ कई तरीकों को कॉल करने की क्षमता प्रदान करता है । Func_get_args और @rajukoyilandy उत्तर देखें , हम उपयोग कर सकते हैं और ।f(x)f(x,y)

  • हाँ, एक ही नाम पर विभिन्न प्रकारों के साथ कई तरीकों को कॉल करने की क्षमता प्रदान करता है । विधि में गेटटेप का आंतरिक उपयोग ।

    • संदर्भों के लिए लेकिन ... केवल चर संदर्भ द्वारा पारित किए जा सकते हैं, आप निरंतर / चर पता लगाने के लिए एक अधिभार का प्रबंधन नहीं कर सकते।
  • एक ही नाम पर विभिन्न मात्राओं के साथ कई विधियों को घोषित करने की क्षमता प्रदान नहीं करता है । ऐसा इसलिए है क्योंकि हम कॉल कर सकते हैं और उसी घोषणा के साथ।f(x)f(x,y)f

  • एक ही नाम के साथ कई प्रकार की घोषणा करने की क्षमता प्रदान नहीं करता है, लेकिन विभिन्न प्रकार । ऐसा इसलिए है क्योंकि PHP संकलक को f($integer,$string) उसी फ़ंक्शन की व्याख्या करनी चाहिए जो कि है f($string,$integer)

"गैर-पारंपरिक ओवरलोडिंग" स्पष्टीकरण के लिए PHP5 ओवरलोडिंग प्रलेखन भी देखें ।

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