পিএইচপি কেন ফাংশন ওভারলোডিং সমর্থন করে না?


37

আমি ভাবছি যে কোনও প্রোগ্রামিং ভাষার অন্যতম প্রধান বৈশিষ্ট্য যদি আর্গুমেন্টের মাধ্যমে ওভারলোড ফাংশন করার ক্ষমতা রাখে। আমি মনে করি এটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের প্রসঙ্গে প্রয়োজনীয়।

এটি কি ইচ্ছাকৃতভাবে পিছনে ফেলে দেওয়া হয়েছে এবং অনুমতি দেওয়া হচ্ছে না? বা ওভারলোডিং একটি ভাল অনুশীলন না?


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

2
@ চার্লসসালভিয়া এটি একটি ভাল উত্তর হবে।
কিমলালুনো

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

যদিও সুনির্দিষ্ট প্রশ্নের উত্তর না হলেও আমি এই লিঙ্কটি পোস্ট করব যা পিএইচপি-তে ওভারলোডিং ব্যবহারের জন্য কীভাবে আমাকে আরও ভালভাবে বুঝতে পেরেছিল। আশা করি এটি সাহায্য করে
ডিয়েগোডিডি

উত্তর:


33

আপনাকে কে বলেছিল পিএইচপি ফাংশন ওভারলোডিং সমর্থন করে না? !!!

আসলে পিএইচপি ফাংশন ওভারলোডিং সমর্থন করে, তবে অন্যভাবে। পিএইচপি-র ওভারলোডিং বৈশিষ্ট্যগুলি জাভা থেকে আলাদা:

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

নিম্নলিখিত কোড ব্লক চেকআউট।

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

পদ্ধতি ওভারলোডিং সহ অবজেক্ট ওরিয়েন্টড অ্যাপ্রোচ:

পিএইচপি-তে ওভারলোডিং গতিসম্পন্ন বৈশিষ্ট্য এবং পদ্ধতিগুলি "তৈরি" করার উপায় সরবরাহ করে। এই গতিশীল সত্তা যাদু পদ্ধতিগুলির মাধ্যমে প্রক্রিয়াজাত করা হয় যেগুলি বিভিন্ন ক্রিয়াকলাপের জন্য কোনও শ্রেণিতে প্রতিষ্ঠা করতে পারে।

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

10
ওভারলোডিং ফাংশন নয়। সত্যই কোনও ফাংশন ওভারলোড করতে, এখন পিএইচপি এর সমতুল্য লিখুন findSum(10, "steve", { 86, "2012-09-20" });। একটি সত্য ওভারলোড বিভিন্ন ধরণের নতুন পরামিতিগুলিকে মঞ্জুরি দেয়।
জোয়েল ইথারটন

3
@ জোয়েলথের্টন - পিএইচপি'র "ওভারলোডিং" এর ব্যাখ্যা বেশিরভাগ অবজেক্ট ওরিয়েন্টেড ভাষার চেয়ে আলাদা। ওভারলোডিং traditionতিহ্যগতভাবে একই নামের সাথে বিভিন্ন পরিমাণ এবং যুক্তিগুলির ধরণের একাধিক পদ্ধতি রাখার ক্ষমতা সরবরাহ করে। রেফ: http://php.net/manual/en/language.oop5.overloading.php পিএইচপি-তে ওভারলোডিং গতিশীলভাবে বৈশিষ্ট্য এবং পদ্ধতিগুলি "তৈরি" করার উপায় সরবরাহ করে। এই গতিশীল সত্তা যাদু পদ্ধতিগুলির মাধ্যমে প্রক্রিয়াজাত করা হয় যেগুলি বিভিন্ন ক্রিয়াকলাপের জন্য কোনও শ্রেণিতে প্রতিষ্ঠা করতে পারে।
rajukoyilandy

7
@ রাজুকোয়িল্যান্ডি: এটি বেশ ভাল এবং ভাল, তবে পিএইচপি কেন "traditionalতিহ্যবাহী" ওভারলোডিং বাস্তবায়ন করে না বলে ওপির প্রশ্ন জিজ্ঞাসা করেছে। আপনার উত্তর যে বিষয়টি সম্বোধন করে না।
জোয়েল ইথারটন

7
এটি ওভারলোডিং নয়। ফাংশনটির কেবলমাত্র একটি সংজ্ঞা / ঘোষণা রয়েছে। এটি সি ++ এ va_list / va_arg এর সমতুল্য। আপনি কি একই সমস্যা কিছু সমাধান করতে পারেন? হ্যাঁ। তবে এটি এখনও অতিরিক্ত লোড হচ্ছে না।
লুক

13

কোনও "ট্র্যাডিশনাল ওভারলোডিং" সম্পূর্ণ সমর্থন নয়, কেবল আংশিক

একটি সংজ্ঞা : "ট্র্যাডিশনাল ওভারলোডিং" কল করার পদ্ধতিটি সরবরাহ করে, একই নামের সাথে একাধিক পদ্ধতি রাখার ক্ষমতা রয়েছে তবে বিভিন্ন পরিমাণ এবং যুক্তিগুলির ধরণ। পদ্ধতি ঘোষণার জন্য , এটি প্রতিটি ওভারলোডেড ক্রিয়াকলাপের জন্য পৃথক / বিচ্ছিন্ন ঘোষণা প্রকাশের বিকল্প সরবরাহ করে।

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


পিএইচপি সহায়তা :

  • হ্যাঁ, একই নামে তবে বিভিন্ন পরিমাণে একাধিক পদ্ধতিতে কল করার ক্ষমতা সরবরাহ করে । দেখুন func_get_args এবং @rajukoyilandy উত্তর, আমরা ব্যবহার করতে পারি এবং ।f(x)f(x,y)

  • হ্যাঁ, একই নামে তবে বিভিন্ন ধরণের একাধিক পদ্ধতিতে কল করার ক্ষমতা সরবরাহ করে । পদ্ধতিতে গেটটাইপের অভ্যন্তরীণ ব্যবহার ।

    • কিন্তু রেফারেন্সের জন্য ... কেবলমাত্র পরিবর্তনশীলগুলি রেফারেন্স দ্বারা পাস করা যায়, আপনি ধ্রুবক / ভেরিয়েবল সনাক্তকরণের জন্য একটি ওভারলোডিং পরিচালনা করতে পারবেন না।
  • একই নামের সাথে ভিন্ন ভিন্ন পরিমাণের সাথে একাধিক পদ্ধতি ঘোষণা করার ক্ষমতা সরবরাহ করে না । এটি কারণ আমরা কল করতে পারি এবং একই ঘোষণা দিয়ে।f(x)f(x,y)f

  • একই নাম নয় তবে বিভিন্ন ধরণের একাধিক পদ্ধতি ঘোষণা করার ক্ষমতা সরবরাহ করে না । এটি কারণ পিএইচপি সংকলক অবশ্যই একই ফাংশন হিসাবে ব্যাখ্যা করতে হবে ।f($integer,$string)f($string,$integer)

"অপ্রচলিত ওভারলোডিং" ব্যাখ্যার জন্য পিএইচপি 5 ওভারলোডিং ডকুমেন্টেশনও দেখুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.