जवाबों:
ओवरलोडिंग उन कार्यों को परिभाषित कर रहा है जिनके समान हस्ताक्षर हैं, फिर भी अलग-अलग पैरामीटर हैं। ओवरराइडिंग केवल व्युत्पन्न वर्गों के लिए उचित है, जहां मूल वर्ग ने एक विधि को परिभाषित किया है और व्युत्पन्न वर्ग उस पद्धति को ओवरराइड करना चाहता है ।
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"
?>
__call
।
फ़ंक्शन ओवरलोडिंग तब होती है जब आप एक ही फ़ंक्शन नाम को दो बार (या अधिक) परिभाषित करते हैं जो विभिन्न मापदंडों के सेट का उपयोग करते हैं। उदाहरण के लिए:
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
।
Subtraction
वर्ग का विस्तार क्यों होगा Addition
। :)
कड़ाई से बोलना, कोई अंतर नहीं है, क्योंकि आप या तो नहीं कर सकते :)
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'
ओवरलोडिंग का उदाहरण
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);
यद्यपि ओवरलोडिंग प्रतिमान PHP द्वारा पूरी तरह से समर्थित नहीं है (या बहुत समान) प्रभाव डिफ़ॉल्ट पैरामीटर (ओं) के साथ प्राप्त किया जा सकता है (जैसा कि किसी ने पहले उल्लेख किया है)।
यदि आप अपने कार्य को इस तरह परिभाषित करते हैं:
function f($p=0)
{
if($p)
{
//implement functionality #1 here
}
else
{
//implement functionality #2 here
}
}
जब आप इस फ़ंक्शन को कॉल करते हैं जैसे:
f();
आपको एक कार्यक्षमता (# 1) मिलेगी, लेकिन अगर आप इसे पैरामीटर जैसे कहते हैं:
f(1);
आपको एक और कार्यक्षमता मिलेगी (# 2)। यह ओवरलोडिंग का प्रभाव है - फ़ंक्शन के इनपुट पैरामीटर (एस) के आधार पर अलग-अलग कार्यक्षमता।
मुझे पता है, कोई अब यह पूछेगा कि अगर वह इस फ़ंक्शन को f (0) कहता है तो उसे क्या कार्यक्षमता मिलेगी।
मैं यहाँ पर बताना चाहूंगा कि PHP में ओवरलोडिंग का अन्य प्रोग्रामिंग भाषाओं की तुलना में पूरी तरह से अलग अर्थ है। बहुत से लोगों ने कहा है कि ओवरलोडिंग को PHP में सपोर्ट नहीं किया जाता है और ओवरलोडिंग की पारंपरिक परिभाषा के अनुसार, हाँ यह कार्यक्षमता isnt स्पष्ट रूप से उपलब्ध है।
हालाँकि, PHP में ओवरलोडिंग की सही परिभाषा पूरी तरह से अलग है।
PHP ओवरलोडिंग में गतिशील रूप से __सेट () और __get () जैसी जादुई विधियों का उपयोग करके गुणों और विधियों का निर्माण करना है। इन ओवरलोडिंग विधियों को उन तरीकों या गुणों के साथ बातचीत करते समय लगाया जाता है जो सुलभ नहीं हैं या घोषित नहीं हैं।
यहाँ PHP मैनुअल से एक लिंक है: http://www.php.net/manual/en/language.oop5.overloading.pp
मेथड ओवरलोडिंग तब होती है जब दो या दो से अधिक विधियाँ एक ही विधि के नाम पर होती हैं लेकिन एकल वर्ग में अलग-अलग संख्याएँ होती हैं। PHP विधि अधिभार का समर्थन नहीं करता है। मेथड ओवरराइडिंग का मतलब एक ही विधि के नाम के साथ दो विधियाँ हैं और दो अलग-अलग वर्गों में समान मापदंडों का अर्थ है अभिभावक वर्ग और बाल वर्ग।
फंक्शन ओवरलोडिंग और ओवरराइडिंग के बीच कुछ अंतर हैं, हालांकि दोनों में एक ही फ़ंक्शन नाम शामिल है। ओवरलोडिंग में, समान नाम फ़ंक्शन के बीच अलग-अलग प्रकार के तर्क या रिटर्न प्रकार होते हैं, जैसे: "फ़ंक्शन ऐड (इंट ए, इंट बी)" और " function add (फ्लोट ए, फ्लोट बी); यहां ऐड () फंक्शन ओवरलोडेड है। ओवरराइड करने के मामले में दोनों तर्क और फ़ंक्शन नाम समान हैं। यह आमतौर पर वंशानुक्रम या लक्षणों में पाया जाता है। हमें परिचय के लिए कुछ युक्तियों का पालन करना होगा। , अब कौन सा फ़ंक्शन निष्पादित करेगा। इसलिए प्रोग्रामर को ओवरराइड करने में वांछित फ़ंक्शन को निष्पादित करने के लिए कुछ युक्तियों का पालन करता है जहां ओवरलोडिंग में प्रोग्राम स्वचालित रूप से वांछित फ़ंक्शन की पहचान कर सकता है ... धन्यवाद!
ओवरलोडिंग: वास्तविक दुनिया में, ओवरलोडिंग का मतलब है किसी को कुछ अतिरिक्त सामान सौंपना। जैसा कि वास्तविक दुनिया में 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
PHP 5.xx ओवरलोडिंग का समर्थन नहीं करता है यही कारण है कि PHP पूरी तरह से OOP नहीं है।