Php में फ़ंक्शन ओवरलोडिंग और ओवरराइडिंग क्या है?


130

PHP में, आप फ़ंक्शन ओवरलोडिंग और फ़ंक्शन ओवरराइडिंग से क्या मतलब है। और उन दोनों में क्या अंतर है? यह पता नहीं लगा सका कि उनके बीच क्या अंतर है।


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

जवाबों:


192

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

PHP में, आप केवल मैजिक विधि का उपयोग करके तरीकों को अधिभारित कर सकते हैं __call

ओवरराइडिंग का एक उदाहरण :

<?php

class Foo {
   function myFoo() {
      return "Foo";
   }
}

class Bar extends Foo {
   function myFoo() {
      return "Bar";
   }
}

$foo = new Foo;
$bar = new Bar;
echo($foo->myFoo()); //"Foo"
echo($bar->myFoo()); //"Bar"
?>

31
PHP ओवरलोडिंग का समर्थन नहीं करता है, हालांकि।
साशा चोडगोव

18
हाँ, इसका उपयोग करता है __call
याकूब रीलकिन

50
PHP वैकल्पिक मापदंडों के माध्यम से अतिभारित करती है।
b01

3
वैकल्पिक मापदंडों के विचार के लिए धन्यवाद, यह एक बहुत ही उपयोगी संकेत है
फैब्रिकियो PH

2
__call () को ट्रिगर किया जाता है जब दुर्गम तरीकों को ऑब्जेक्ट संदर्भ में कहा जाता है __callStatic () मेगा विधि को ट्रिगर किया जाता है जब दुर्गम तरीकों को स्थिर संदर्भ में कहा जाता है। PHP संदर्भ में ओवरलोडिंग का अधिक विस्तृत उदाहरण और स्पष्टीकरण प्राप्त करने के लिए इसका अनुसरण करें: PHP ओवरलोडिंग
कोड बस्टर

107

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

class Addition {
  function compute($first, $second) {
    return $first+$second;
  }

  function compute($first, $second, $third) {
    return $first+$second+$third;
  }
}

ऊपर के उदाहरण में, फ़ंक्शन computeदो अलग-अलग पैरामीटर हस्ताक्षर के साथ अतिभारित है। * यह अभी तक PHP में समर्थित नहीं है। वैकल्पिक तर्क का उपयोग करना एक विकल्प है:

class Addition {
  function compute($first, $second, $third = 0) {
    return $first+$second+$third;
  }
}

ओवरराइडिंग फ़ंक्शन तब होता है जब आप एक वर्ग का विस्तार करते हैं और एक फ़ंक्शन को फिर से लिखते हैं जो मूल वर्ग में मौजूद था:

class Substraction extends Addition {
  function compute($first, $second, $third = 0) {
    return $first-$second-$third;
  }
}

उदाहरण के लिए, अंदर computeदिए गए व्यवहार को ओवरराइड करता है Addition


9
फंक्शन ओवरलोडिंग को छोड़कर PHP, AFAIK में समर्थित नहीं है। इसके अलावा, एक असंबंधित पक्ष नोट के रूप में, मुझे यकीन नहीं है कि आपके पास एक Subtractionवर्ग का विस्तार क्यों होगा Addition। :)
साशा चोडगोव

6
@musicfreak: 12:40 AM स्थानीय समय ... एक बेहतर उदाहरण के बारे में नहीं सोच सकता।
एंड्रयू मूर

5
यह अभी तक PHP में समर्थित नहीं है और शायद कभी नहीं होगा, क्योंकि PHP कमजोर रूप से टाइप की जाने वाली भाषा है और इस मामले में कुछ भी बदलने वाला नहीं है।
क्रोज़िन

2
ओवरलोडिंग न केवल तब होती है जब आप विभिन्न प्रकार के मापदंडों का उपयोग करके एक ही फ़ंक्शन नाम को दो बार (या अधिक बार) परिभाषित करते हैं। आम तौर पर, ओवरलोडिंग तब भी होती है जब आप एक ही फ़ंक्शन नाम को दो बार (या अधिक बार) परिभाषित करते हैं, एक ही संख्या में कई मापदंडों का उपयोग करके। चूंकि PHP में कोई चर प्रकार की घोषणा नहीं है (जैसे जावा में) यह सामान्यीकरण कोई फर्क नहीं पड़ता। मैं सिर्फ इस बात के लिए उल्लेख कर रहा हूं कि अधिभार क्या है।
sbrbot

2
@sbrbot: सेट का तात्पर्य संख्या और प्रकार दोनों से है।
एंड्रयू मूर

22

कड़ाई से बोलना, कोई अंतर नहीं है, क्योंकि आप या तो नहीं कर सकते :)

APD की तरह PHP एक्सटेंशन के साथ फंक्शन ओवरराइडिंग की जा सकती थी, लेकिन यह अपग्रेड किया गया है और पिछले संस्करण अनुपयोगी था।

PHP में फ़ंक्शन ओवरलोडिंग को डायनेमिक टाइपिंग के कारण नहीं किया जा सकता है, अर्थात PHP में आप किसी विशेष प्रकार के चर को "परिभाषित" नहीं करते हैं। उदाहरण:

$a=1;
$a='1';
$a=true;
$a=doSomething();

प्रत्येक चर एक अलग प्रकार का है, फिर भी आप निष्पादन से पहले प्रकार जान सकते हैं (4 एक देखें)। तुलना के रूप में, अन्य भाषाएं उपयोग करती हैं:

int a=1;
String s="1";
bool a=true;
something a=doSomething();

अंतिम उदाहरण में, आपको चर के प्रकार को बलपूर्वक सेट करना होगा (उदाहरण के लिए, मैंने डेटा प्रकार "कुछ" का उपयोग किया है)।


एक और "मुद्दा" क्यों फ़ंक्शन ओवरलोडिंग PHP में संभव नहीं है: PHP में एक फ़ंक्शन है जिसे func_get_args () कहा जाता है, जो वर्तमान तर्कों की एक सरणी देता है, अब निम्नलिखित कोड पर विचार करें:

function hello($a){
  print_r(func_get_args());
}

function hello($a,$a){
  print_r(func_get_args());
}

hello('a');
hello('a','b');

दोनों कार्यों को ध्यान में रखते हुए, किसी भी तर्क को स्वीकार करना चाहिए, जिसे कंपाइलर को चुनना चाहिए?


अंत में, मैं यह बताना चाहता हूं कि उपरोक्त उत्तर आंशिक रूप से गलत क्यों हैं; ओवरलोडिंग / ओवरराइडिंग फंक्शन ओवरलोडिंग / ओवरराइडिंग विधि के बराबर नहीं है ।

जहां एक विधि एक फ़ंक्शन की तरह है, लेकिन एक वर्ग के लिए विशिष्ट है, उस स्थिति में, PHP कक्षाओं में ओवरराइडिंग की अनुमति देता है, लेकिन भाषा के शब्दार्थ के कारण फिर से कोई ओवरलोडिंग नहीं करता है।

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

/// Function Overriding ///

function a(){
   alert('a');
}
a=function(){
   alert('b');
}

a(); // shows popup with 'b'


/// Method Overriding ///

var a={
  "a":function(){
    alert('a');
  }
}
a.a=function(){
   alert('b');
}

a.a(); // shows popup with 'b'

2
PHP 5.xx ओवरलोडिंग का समर्थन नहीं करता है यही कारण है कि PHP पूरी तरह से OOP नहीं है।
PHP फेरारी

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

@ ringø Nope, PHP में नामित कार्य अपरिवर्तनीय हैं। एक बार जब आप PHP में एक नामित फ़ंक्शन बनाते हैं, तो ऐसा कोई तरीका नहीं है जिससे आप इसके आंतरिक व्यवहार (ओवरराइडिंग) को संशोधित कर सकें। जब तक आपका मतलब ओवरराइड करने का तरीका नहीं है, जो कुछ और है .. आपको पहली पंक्ति में टिप्पणी करने से पहले पूरे उत्तर को पढ़ना चाहिए। :)
क्रिश्चियन

@Christian खैर, PHP में (और कई अन्य भाषाओं में) कोर्स एक कक्षा में होता है । तो, हाँ, हम विधियों के बारे में बात कर रहे हैं - भले ही उनमें से प्रत्येक कीवर्ड फ़ंक्शन के साथ उपसर्ग कर रहा हो । लेकिन वास्तव में मुझे पूरा उत्तर पहले पढ़ना चाहिए था ...
e2-e4

9

ओवरलोडिंग का उदाहरण

class overload {
    public $name;
    public function __construct($agr) {
        $this->name = $agr;
    }
    public function __call($methodname, $agrument) {
         if($methodname == 'sum2') {

          if(count($agrument) == 2) {
              $this->sum($agrument[0], $agrument[1]);
          }
          if(count($agrument) == 3) {

              echo $this->sum1($agrument[0], $agrument[1], $agrument[2]);
          }
        }
    }
    public function sum($a, $b) {
        return $a + $b;
    }
    public function sum1($a,$b,$c) {

        return $a + $b + $c;
    }
}
$object = new overload('Sum');
echo $object->sum2(1,2,3);

अच्छा कस्टम कार्यान्वयन, लेकिन यह भाषा द्वारा दिया जाना चाहिए।
4EACH

यह विधि नहीं है, फ़ंक्शन ओवरलोडिंग है, जबकि आप प्रत्येक छात्र के लिए अलग-अलग विधि नाम का उपयोग कर रहे हैं
टॉमस्वायर

5

यद्यपि ओवरलोडिंग प्रतिमान PHP द्वारा पूरी तरह से समर्थित नहीं है (या बहुत समान) प्रभाव डिफ़ॉल्ट पैरामीटर (ओं) के साथ प्राप्त किया जा सकता है (जैसा कि किसी ने पहले उल्लेख किया है)।

यदि आप अपने कार्य को इस तरह परिभाषित करते हैं:

function f($p=0)
{
  if($p)
  {
    //implement functionality #1 here
  }
  else
  {
    //implement functionality #2 here
  }
}

जब आप इस फ़ंक्शन को कॉल करते हैं जैसे:

f();

आपको एक कार्यक्षमता (# 1) मिलेगी, लेकिन अगर आप इसे पैरामीटर जैसे कहते हैं:

f(1);

आपको एक और कार्यक्षमता मिलेगी (# 2)। यह ओवरलोडिंग का प्रभाव है - फ़ंक्शन के इनपुट पैरामीटर (एस) के आधार पर अलग-अलग कार्यक्षमता।

मुझे पता है, कोई अब यह पूछेगा कि अगर वह इस फ़ंक्शन को f (0) कहता है तो उसे क्या कार्यक्षमता मिलेगी।


1

मैं यहाँ पर बताना चाहूंगा कि PHP में ओवरलोडिंग का अन्य प्रोग्रामिंग भाषाओं की तुलना में पूरी तरह से अलग अर्थ है। बहुत से लोगों ने कहा है कि ओवरलोडिंग को PHP में सपोर्ट नहीं किया जाता है और ओवरलोडिंग की पारंपरिक परिभाषा के अनुसार, हाँ यह कार्यक्षमता isnt स्पष्ट रूप से उपलब्ध है।

हालाँकि, PHP में ओवरलोडिंग की सही परिभाषा पूरी तरह से अलग है।

PHP ओवरलोडिंग में गतिशील रूप से __सेट () और __get () जैसी जादुई विधियों का उपयोग करके गुणों और विधियों का निर्माण करना है। इन ओवरलोडिंग विधियों को उन तरीकों या गुणों के साथ बातचीत करते समय लगाया जाता है जो सुलभ नहीं हैं या घोषित नहीं हैं।

यहाँ PHP मैनुअल से एक लिंक है: http://www.php.net/manual/en/language.oop5.overloading.pp


1

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


0

फंक्शन ओवरलोडिंग और ओवरराइडिंग के बीच कुछ अंतर हैं, हालांकि दोनों में एक ही फ़ंक्शन नाम शामिल है। ओवरलोडिंग में, समान नाम फ़ंक्शन के बीच अलग-अलग प्रकार के तर्क या रिटर्न प्रकार होते हैं, जैसे: "फ़ंक्शन ऐड (इंट ए, इंट बी)" और " function add (फ्लोट ए, फ्लोट बी); यहां ऐड () फंक्शन ओवरलोडेड है। ओवरराइड करने के मामले में दोनों तर्क और फ़ंक्शन नाम समान हैं। यह आमतौर पर वंशानुक्रम या लक्षणों में पाया जाता है। हमें परिचय के लिए कुछ युक्तियों का पालन करना होगा। , अब कौन सा फ़ंक्शन निष्पादित करेगा। इसलिए प्रोग्रामर को ओवरराइड करने में वांछित फ़ंक्शन को निष्पादित करने के लिए कुछ युक्तियों का पालन करता है जहां ओवरलोडिंग में प्रोग्राम स्वचालित रूप से वांछित फ़ंक्शन की पहचान कर सकता है ... धन्यवाद!


0

ओवरलोडिंग: वास्तविक दुनिया में, ओवरलोडिंग का मतलब है किसी को कुछ अतिरिक्त सामान सौंपना। जैसा कि वास्तविक दुनिया में PHP में ओवरलोडिंग का अर्थ है अतिरिक्त कार्यों को कॉल करना। दूसरे तरीके से आप कह सकते हैं कि इसमें अलग-अलग पैरामीटर के साथ स्लिमियर फंक्शन है। PHP में आप मैजिक फंक्शन जैसे __get, __set, __call आदि के साथ ओवरलोडिंग का उपयोग कर सकते हैं।

ओवरलोडिंग का उदाहरण:

class Shape {
   const Pi = 3.142 ;  // constant value
  function __call($functionname, $argument){
    if($functionname == 'area')
    switch(count($argument)){
        case 0 : return 0 ;
        case 1 : return self::Pi * $argument[0] ; // 3.14 * 5
        case 2 : return $argument[0] * $argument[1];  // 5 * 10
    }

  }

 }
 $circle = new Shape();`enter code here`
 echo "Area of circle:".$circle->area()."</br>"; // display the area of circle Output 0
 echo "Area of circle:".$circle->area(5)."</br>"; // display the area of circle
 $rect = new Shape();
 echo "Area of rectangle:".$rect->area(5,10); // display area of rectangle

ओवरराइडिंग : ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में ओवरराइडिंग को चाइल्ड क्लास में पैरेंट मेथड को बदलना है। ओवरराइडिंग में आप चाइल्ड क्लास में पेरेंट क्लास मेथड को री-डिक्लेयर कर सकते हैं। तो, मूल रूप से ओवरराइड करने का उद्देश्य आपके मूल वर्ग पद्धति के व्यवहार को बदलना है।

ओवरराइडिंग का उदाहरण:

class parent_class
{

  public function text()    //text() is a parent class method
  {
    echo "Hello!! everyone I am parent class text method"."</br>";
  }
  public function test()   
  {
    echo "Hello!! I am second method of parent class"."</br>";
  }

}

class child extends parent_class
{
  public function text()     // Text() parent class method which is override by child 
  class
  {
    echo "Hello!! Everyone i am child class";
  }

 }

 $obj= new parent_class();
 $obj->text();            // display the parent class method echo
 $obj= new parent_class();
 $obj->test();
 $obj= new child();
 $obj->text(); // display the child class method echo

-14

PHP 5.xx ओवरलोडिंग का समर्थन नहीं करता है यही कारण है कि PHP पूरी तरह से OOP नहीं है।


18
मुझे नहीं पता कि आपको यह विचार कहां से मिला है कि ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के लिए एक आवश्यकता को ओवरलोड करना है।
21

6
@ ड्र्यूइश क्योंकि पैरामीट्रिक बहुरूपता OOP की सबसे महत्वपूर्ण विशेषताओं में से एक है?
डावोर

1
@ ड्र्यूईश यदि आप बहुरूपता को ओओपी के मुख्य ठहराव में से एक के रूप में गिनते हैं। फिर संकलन के लिए अस्थिर रूप से ओवरलोडिंग वहाँ से बाहर है। हालाँकि, विधि अधिभार संकलित समय बहुरूपता है और इसे स्थैतिक बहुरूपता भी कहा जाता है।
यासिर अरेफिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.