পিএইচপি তে ফাংশন ওভারলোডিং এবং ওভাররাইড কী?


130

পিএইচপি-তে, ফাংশন ওভারলোডিং এবং ফাংশন ওভাররাইডিং বলতে আপনার কী বোঝায়? এবং তাদের উভয়ের মধ্যে পার্থক্য কী? তাদের মধ্যে পার্থক্য কী তা বুঝতে পারি না।


আপনি এই লিঙ্কটিতে ওভারলোডযোগ্য
হিশাম দালাল

উত্তর:


192

ওভারলোডিং এমন ফাংশনগুলি সংজ্ঞায়িত করছে যেগুলির অনুরূপ স্বাক্ষর রয়েছে, তবে বিভিন্ন পরামিতি রয়েছে। অগ্রাহ্য শুধুমাত্র উদ্ভূত ক্লাস, যেখানে পিতা বা মাতা বর্গ একটি পদ্ধতি সংজ্ঞায়িত হয়েছে এবং উদ্ভূত বর্গ শুভেচ্ছা করতে প্রাসঙ্গিক হয় ওভাররাইড যে পদ্ধতি।

পিএইচপি-তে, আপনি কেবল যাদু পদ্ধতি ব্যবহার করে পদ্ধতিগুলি ওভারলোড করতে পারেন __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
যদিও পিএইচপি ওভারলোডিং সমর্থন করে না।
সাশা চেদিগোভ

18
হ্যাঁ, এটি ব্যবহার করে __call
ইয়াকুব রিলকিন

50
পিএইচপি alচ্ছিক পরামিতিগুলির মাধ্যমে ওভারলোডিংয়ের বিকল্প করে।
বি01


2
অ্যাক্সেসযোগ্য পদ্ধতিগুলিকে অবজেক্ট কনটেক্সটে ডাকা হলে __call () ট্রিগার করা হয় __callStatic () মাইজিক পদ্ধতি ট্রিগার করা হয় যখন অ্যাক্সেসযোগ্য পদ্ধতিগুলি স্থির প্রসঙ্গে বলা হয়। পিএইচপি প্রসঙ্গে ওভারলোডিংয়ের আরও বিস্তারিত উদাহরণ এবং ব্যাখ্যা পেতে এটি অনুসরণ করুন: পিএইচপি ওভারলোডিং
কোড বুস্টার

107

আপনি বিভিন্ন পরামিতিগুলির সেট ব্যবহার করে একই ফাংশনটির নাম দু'বার (বা আরও) সংজ্ঞায়িত করলে ফাংশন ওভারলোডিং ঘটে। উদাহরণ স্বরূপ:

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

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

উপরের উদাহরণে, ফাংশনটি computeদুটি পৃথক পরামিতি স্বাক্ষরের সাথে ওভারলোড হয়েছে। * এটি এখনও পিএইচপি সমর্থন করে না। বিকল্প বিকল্প useচ্ছিক আর্গুমেন্ট ব্যবহার করা হয়:

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
পিএইচপি, এএফআইএকে ব্যতীত ফাংশন ওভারলোডিং সমর্থিত নয়। এছাড়াও, একটি সম্পর্কযুক্ত পার্শ্ব নোট হিসাবে, আমি নিশ্চিত না কেন আপনার Subtractionক্লাসটি ক্লাসটি বাড়িয়ে দেবে Addition। :)
সাশা চেদিগোভ

6
@ মিউজিকফ্রিয়াক: স্থানীয় সময় সকাল ১১:৪০ ... আরও ভাল উদাহরণের কথা ভাবতে পারিনি।
অ্যান্ড্রু মুর

5
এটি এখনও পিএইচপি-তে সমর্থিত নয় এবং সম্ভবত কখনই হবে না, কারণ পিএইচপি হ'ল দুর্বল-টাইপযুক্ত ভাষা এবং এই ক্ষেত্রে কোনও কিছুই বদলাচ্ছে না।
ক্রুজিন

2
ওভারলোডিং কেবলমাত্র যখন আপনি বিভিন্ন পরামিতিগুলির সেট ব্যবহার করে একই ফাংশনটির নাম দু'বার (বা আরও বেশিবার) সংজ্ঞায়িত করেন না। সাধারণত, ওভারলোডিং হ'ল আপনি যখন একই ফাংশনটির নামটি একই সংখ্যক পরামিতি ব্যবহার করে তবে বিভিন্ন ধরণের ব্যবহার করেন twice যেহেতু পিএইচপি-তে কোনও পরিবর্তনশীল ধরণের ঘোষণা নেই (জাভা-র মতো) এই সাধারণীকরণটি কোনও বিষয় নয়। আমি ওভারলোডিং কী তা সুনির্দিষ্টতার জন্য এটি উল্লেখ করছি।
sbrbot

2
@ এসআরবোট: সেটটি সংখ্যা এবং প্রকার উভয়ই বোঝায়।
অ্যান্ড্রু মুর

22

কড়া কথা বলতে গেলে, কোনও পার্থক্য নেই, যেহেতু আপনিও করতে পারবেন না :)

এপিডির মতো পিএইচপি এক্সটেনশান দিয়ে ফাংশন ওভাররাইড করা যেতে পারে তবে এটি অবহেলা করা হয়েছে এবং আফিকের শেষ সংস্করণটি ব্যবহারযোগ্য নয়।

ডায়নামিক টাইপিংয়ের কারণে পিএইচপি-তে ফাংশন ওভারলোডিং করা যায় না, অর্থাৎ পিএইচপি-তে আপনি কোনও নির্দিষ্ট ধরণের ভেরিয়েবলকে "সংজ্ঞায়িত" করেন না। উদাহরণ:

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

প্রতিটি ভেরিয়েবল বিভিন্ন ধরণের, তবুও আপনি মৃত্যুদন্ড কার্যকর করার আগে টাইপটি জানতে পারবেন (চতুর্থটি দেখুন)। তুলনা হিসাবে, অন্যান্য ভাষা ব্যবহার করে:

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

শেষ উদাহরণে, আপনাকে অবশ্যই ভেরিয়েবলের ধরণের চাপ প্রয়োগ করতে হবে (উদাহরণস্বরূপ, আমি ডেটা টাইপ "কিছু" ব্যবহার করেছি)।


পিএইচপি-তে ফাংশন ওভারলোডিং কেন সম্ভব নয় এমন আরেকটি "ইস্যু": পিএইচপি-র ফানক_জেট_আর্গস () নামে একটি ফাংশন রয়েছে, যা বর্তমান আর্গুমেন্টগুলির একটি অ্যারে ফিরিয়ে দেয়, এখন নিম্নলিখিত কোডটি বিবেচনা করুন:

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

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

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

উভয় ফাংশন বিবেচনা করে কোনও পরিমাণ আর্গুমেন্ট গ্রহণ করে, কোনটি সংকলকটি বেছে নেওয়া উচিত?


পরিশেষে, আমি উপরের উত্তরগুলি আংশিক ভুল কেন তা উল্লেখ করতে চাই; ফাংশন ওভারলোডিং / ওভাররাইডিং পদ্ধতি ওভারলোডিং / ওভাররাইডিং এর সমান নয় ।

যেখানে কোনও পদ্ধতি কোনও ফাংশনের মতো তবে শ্রেণীর জন্য নির্দিষ্ট, সেই ক্ষেত্রে, পিএইচপি ক্লাসগুলিতে ওভাররাইড করার অনুমতি দেয় তবে ভাষা শব্দার্থের কারণে আবার কোনও ওভারলোডিং হয় না।

উপসংহারে, জাভাস্ক্রিপ্টের মতো ভাষাগুলি ওভাররাইডের অনুমতি দেয় (তবে আবার কোনও ওভারলোডিং নেই) তবে তারা ব্যবহারকারীর কার্যকারিতা এবং কোনও পদ্ধতির ওভাররাইডের মধ্যে পার্থক্যও দেখাতে পারে:

/// 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
পিএইচপি 5.XX ওভারলোডিং সমর্থন করে না এই কারণেই পিএইচপি পুরোপুরি OOP নয়।
পিএইচপি ফেরারি

30
এটি এমন নয় যে পিএইচপি ওভারলোডিংকে সমর্থন করে না, এটি এটি বোঝাতে পারে না। সমস্যাটি পিএইচপি ডায়নামিক ধরণের ব্যবহারের কারণে। প্রকৃতপক্ষে, জাভাস্ক্রিপ্ট ওভারলোডিংকে সমর্থন করে না এবং এটি এখনও OOP। "পিএইচপি সম্পূর্ণরূপে ওওপি নয়" ফিউড কেবলমাত্র বিদ্যমান কারণ কিছু লোক ওওপ কি না তা বিচার করার জন্য একটি চেক-লিস্ট ব্যবহার করার সিদ্ধান্ত নিয়েছে।
খ্রিস্টান

@ রিং- নাহ, পিএইচপি-র নামকৃত কার্যগুলি অপরিবর্তনীয়। একবার আপনি পিএইচপি-তে একটি নামযুক্ত ফাংশন তৈরি করার পরে, আপনি এর অভ্যন্তরীণ আচরণ (ওভাররাইডিং) পরিবর্তন করতে পারবেন না। যদি না আপনি বোঝায় যে পদ্ধতিটি ওভাররাইড হচ্ছে যা অন্যরকম কিছু .. আপনার প্রথম উত্তরটিতে মন্তব্য করার আগে পুরো উত্তরটি পড়া উচিত। :)
খ্রিস্টান

@ ক্রিশ্চিয়ান ওয়েল, অবশ্যই পিএইচপি (এবং আরও অনেক ভাষায়) একটি শ্রেণিতে ওভাররাইডিং ঘটে । সুতরাং, হ্যাঁ, আমরা পদ্ধতিগুলি নিয়ে কথা বলছি - যদিও তাদের প্রত্যেকটি কীওয়ার্ড ফাংশনের সাথে উপসর্গ করা হয়েছে । তবে প্রকৃতপক্ষে আমার পুরো উত্তরটি প্রথমে পড়া উচিত ছিল ...
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);

দুর্দান্ত কাস্টম বাস্তবায়ন, তবে এটি ভাষা দ্বারা দেওয়া উচিত।
এএইচ

এটি কোনও পদ্ধতি নয়, ফাংশন ওভারলোডিং, যখন আপনি প্রতিটি স্তন্যপায়ীদের জন্য আলাদা পদ্ধতির নাম ব্যবহার করেন
টমসওয়ায়ার

5

যদিও ওভারলোডিং দৃষ্টান্তটি পিএইচপি দ্বারা সম্পূর্ণরূপে সমর্থিত নয় ডিফল্ট প্যারামিটার (গুলি) (যেমন আগে কেউ উল্লেখ করেছেন) দিয়ে একই (বা খুব অনুরূপ) প্রভাব অর্জন করা যেতে পারে।

আপনি যদি নিজের ফাংশনটিকে এভাবে নির্দিষ্ট করে থাকেন:

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

আপনি যখন এই ফাংশনটি কল করবেন:

f();

আপনি একটি কার্যকারিতা পাবেন (# 1), তবে আপনি যদি এইটিকে প্যারামিটার দিয়ে কল করেন:

f(1);

আপনি অন্য কার্যকারিতা পাবেন (# 2)। এটি ওভারলোডিংয়ের প্রভাব - ফাংশনের ইনপুট প্যারামিটার (গুলি) এর উপর নির্ভর করে বিভিন্ন কার্যকারিতা।

আমি জানি, কেউ এখন জিজ্ঞাসা করবে যে সে / সে এই ফাংশনটিকে এফ (0) হিসাবে ডাকে তবে তার কার্যকারিতা কী হবে।


1

আমি এখানে উল্লেখ করতে চাই যে পিএইচপি-তে ওভারলোডিংয়ের অন্যান্য প্রোগ্রামিং ভাষার তুলনায় সম্পূর্ণ ভিন্ন অর্থ রয়েছে। প্রচুর লোক বলেছে যে পিএইচপি এবং ওভারলোডিংয়ের প্রচলিত সংজ্ঞা দ্বারা ওভারলোডিং সমর্থিত নয়, হ্যাঁ কার্যকারিতা সুস্পষ্টভাবে উপলভ্য নয়।

তবে পিএইচপি-তে ওভারলোডিংয়ের সঠিক সংজ্ঞা সম্পূর্ণ আলাদা।

পিএইচপি-তে ওভারলোডিং বলতে __set () এবং __get () এর মতো যাদু পদ্ধতি ব্যবহার করে গতিশীলভাবে বৈশিষ্ট্য এবং পদ্ধতি তৈরি বোঝায়। অ্যাক্সেসযোগ্য বা ঘোষিত নয় এমন পদ্ধতি বা বৈশিষ্ট্যগুলির সাথে ইন্টারঅ্যাক্ট করার সময় এই ওভারলোডিং পদ্ধতিগুলি ডাকা হয়।

এখানে পিএইচপি ম্যানুয়াল থেকে একটি লিঙ্ক দেওয়া হয়েছে: http://www.php.net/manual/en/language.oop5.overloading.php


1

দুই বা ততোধিক পদ্ধতি একই পদ্ধতির নাম সহ তবে একক শ্রেণিতে বিভিন্ন সংখ্যক পরামিতি যুক্ত হলে পদ্ধতি ওভারলোডিং হয়। পিএইচপি পদ্ধতি ওভারলোডিং সমর্থন করে না। মেথড ওভাররাইডিং অর্থ দুটি ভিন্ন ক্লাসে একই পদ্ধতির নাম এবং একই সংখ্যার পরামিতি সহ দুটি পদ্ধতি মানে পিতামাত্ত শ্রেণি এবং শিশু শ্রেণি।


0

ফাংশন ওভারলোডিং এবং ওভাররাইডের মধ্যে কিছু পার্থক্য রয়েছে যদিও উভয় ক্ষেত্রে একই ফাংশনের নাম রয়েছে over একই নামের মধ্যে ওভারলোডিংয়ের মধ্যে বিভিন্ন ধরণের আর্গুমেন্ট বা রিটার্ন টাইপ থাকে; যেমন: "ফাংশন অ্যাড (ইন্ট এ, ইনট বি)" এবং " ফাংশন অ্যাড (ফ্লোট এ, ফ্লোট বি); এখানে অ্যাড () ফাংশনটি ওভারলোড হয়েছে over যুক্তি এবং ফাংশন নাম উভয়ই একই ক্ষেত্রে দেখা যায় generally এটি সাধারণত উত্তরাধিকারে বা বৈশিষ্ট্যে পাওয়া যায় W আমাদের প্রবর্তনের জন্য কিছু কৌশল অনুসরণ করতে হবে , কী ফাংশনটি এখন কার্যকর করবে। সুতরাং প্রোগ্রামার ওভাররাইডে কাঙ্ক্ষিত ফাংশনটি সম্পাদন করার জন্য কিছু কৌশল অনুসরণ করে যেখানে ওভারলোডিংয়ের মধ্যে প্রোগ্রামটি স্বয়ংক্রিয়ভাবে পছন্দসই ফাংশনটি সনাক্ত করতে পারে ... ধন্যবাদ!


0

ওভারলোডিং : রিয়েল ওয়ার্ল্ডে ওভারলোডিং অর্থ কাউকে কিছু অতিরিক্ত জিনিস বরাদ্দ করা। বাস্তব পৃথিবীর মতো পিএইচপি-তে ওভারলোডিং মানে অতিরিক্ত ফাংশনগুলিকে কল করা। অন্য উপায়ে আপনি বলতে পারেন যে এটির বিভিন্ন পরামিতিগুলির সাথে স্লিমিয়ার ফাংশন রয়েছে PH পিএইচপি-তে আপনি যাদু ফাংশনগুলির সাথে ওভারলোডিং ব্যবহার করতে পারেন যেমন __get, __set, __call ইত্যাদি can

ওভারলোডিং এর উদাহরণ:

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

ওভাররাইডিং : অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ওভাররাইডিংয়ে শিশু শ্রেণিতে পিতামাতার পদ্ধতি প্রতিস্থাপন করা হয় over ওভাররাইডিংয়ের সময় আপনি শিশু শ্রেণিতে পিতামাতার শ্রেণির পদ্ধতিটি পুনরায় ঘোষণা করতে পারেন। সুতরাং, মূলত ওভাররাইডের উদ্দেশ্য হ'ল আপনার পিতামাতার বর্গ পদ্ধতির আচরণ পরিবর্তন করা।

ওভাররাইডের উদাহরণ:

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

পিএইচপি 5.XX ওভারলোডিং সমর্থন করে না এই কারণেই পিএইচপি পুরোপুরি OOP নয়।


18
আমি জানি না আপনি কোথায় ধারণা পেয়েছেন যে ওজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের জন্য প্রয়োজনীয়তা ওভারলোডিং।
২১ শে

6
@ ড্রুইশ কারণ প্যারাম্যাট্রিক পলিমারফিজম ওওপির অন্যতম গুরুত্বপূর্ণ বৈশিষ্ট্য?
Davor

1
@ ড্রুয়েশ করুন যদি আপনি পলিমারফিজমটিকে ওওপির অন্যতম প্রধান স্থবির হিসাবে গণনা করেন। তারপরে ওভারলোডিং বাহ্যভাবে সংকলনের জন্য বাইরে রয়েছে। তবে মেথড ওভারলোডিং হ'ল কমপাইল টাইম পলিমারফিজম এবং এটি স্ট্যাটিক পলিমারফিজম হিসাবেও পরিচিত।
ইয়াসির আরেফিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.