Mengapa PHP tidak mendukung fungsi yang berlebihan?

37

Saya bertanya-tanya apakah salah satu fitur utama dari bahasa pemrograman adalah memiliki kemampuan untuk membebani fungsi melalui argumen. Saya pikir ini penting dalam konteks pemrograman berorientasi objek.

Apakah sengaja ditinggalkan dan tidak diizinkan? Atau apakah kelebihan beban bukan praktik yang baik?

pengguna1179459
sumber
27
Fungsi overloading sebenarnya bukan fitur pemrograman OO. Fungsi sub-kelas over-riding untuk tujuan polimorfisme biasanya dianggap sebagai fitur yang diperlukan OO - tetapi bukan fungsi overloading berdasarkan argumen. Python juga tidak memiliki fungsi berbasis argumen. Bagaimanapun, fungsi kelebihan mungkin lebih praktis dalam bahasa yang diketik secara statis di mana pengikatan fungsi terjadi pada waktu kompilasi dan didasarkan pada jenis setiap parameter fungsi.
Charles Salvia
2
@CharlesSalvia Itu jawaban yang bagus.
kiamlaluno
1
Apa yang dia katakan. Selain itu, fungsi kelebihan beban terlalu dibesar-besarkan. Anda tidak harus menggunakan nama fungsi yang sama untuk fungsi yang berbeda; cukup berikan nama fungsi Anda yang serupa tetapi tidak identik. Operator kelebihan beban di sisi lain ...
Mr Lister
Meskipun bukan jawaban untuk pertanyaan spesifik, saya akan memposting tautan ini yang membuat saya lebih mengerti BAGAIMANA menggunakan overloading di PHP. Semoga ini bisa membantu
DiegoDD

Jawaban:

33

Siapa bilang PHP tidak mendukung fungsi yang berlebihan? !!!

Sebenarnya PHP memang mendukung fungsi overloading, tetapi dengan cara yang berbeda. Fitur kelebihan PHP berbeda dari Java:

Interpretasi PHP tentang "kelebihan beban" berbeda dari kebanyakan bahasa yang berorientasi objek. Overloading secara tradisional memberikan kemampuan untuk memiliki beberapa metode dengan nama yang sama tetapi jumlah dan jenis argumen yang berbeda.

Periksa blok kode berikut.

Berfungsi untuk mencari jumlah n angka:

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

Berfungsi untuk menambahkan dua angka atau untuk menggabungkan dua string:

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

Pendekatan Berorientasi Objek termasuk Metode Overloading:

Overloading di PHP menyediakan cara untuk secara dinamis "membuat" properti dan metode. Entitas dinamis ini diproses melalui metode ajaib yang dapat dibangun di kelas untuk berbagai jenis tindakan.

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

Dalam PHP, overloading berarti Anda dapat menambahkan anggota objek pada saat run-time, dengan menerapkan beberapa metode sihir seperti __set, __get, __calldll

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
rajukoyilandy
sumber
29
Bit kedua tentang apa yang disebut PHP "overloading" tidak terlalu mirip. Hanya saja PHP menggunakan nama mapan untuk sesuatu yang kebanyakan berbeda, mengingat itu PHP, tidak terlalu mengejutkan.
phant0m
10
Itu bukan fungsi yang berlebihan. Untuk benar-benar membebani suatu fungsi, sekarang tulis setara dengan php findSum(10, "steve", { 86, "2012-09-20" });. Overload sejati akan memungkinkan parameter baru dari berbagai jenis.
Joel Etherton
3
@ JoelEtherton - Interpretasi PHP tentang "overloading" berbeda dari kebanyakan bahasa berorientasi objek. Overloading secara tradisional memberikan kemampuan untuk memiliki beberapa metode dengan nama yang sama tetapi jumlah dan jenis argumen yang berbeda. ref: http://php.net/manual/en/language.oop5.overloading.php Overloading dalam PHP menyediakan cara untuk secara dinamis "membuat" properti dan metode. Entitas dinamis ini diproses melalui metode ajaib yang dapat dibangun di kelas untuk berbagai jenis tindakan.
rajukoyilandy
7
@rajukoyilandy: Itu bagus dan bagus, tapi pertanyaan OP menanyakan mengapa PHP tidak menerapkan kelebihan muatan "tradisional". Jawaban Anda tidak mengatasinya.
Joel Etherton
7
Ini bukan kelebihan beban. Hanya ada satu definisi / deklarasi fungsi. Ini akan sama dengan va_list / va_arg di C ++. Bisakah Anda memecahkan beberapa masalah yang sama? Iya nih. Tapi itu masih belum kelebihan.
Luke
13

Bukan dukungan penuh "Overloading Tradisional", hanya sebagian .

DEFINISI : "Overloading Tradisional" memberikan, saat memanggil metode, kemampuan untuk memiliki banyak metode dengan nama yang sama tetapi jumlah dan jenis argumen yang berbeda. Untuk deklarasi metode , ini memberikan opsi untuk mengekspresikan deklarasi terpisah / terisolasi untuk setiap fungsi kelebihan beban.

Catatan: bagian kedua dari definisi ini biasanya dikaitkan dengan yang diketik secara statis bahasa pemrograman yang yang melakukan pemeriksaan tipe dan / atau pemeriksaan arity , untuk memilih deklarasi yang benar. PHP bukan bahasa yang diketik secara statis, itu dinamis , dan menggunakan pengetikan yang lemah .


DUKUNGAN PHP :

  • YA, memberikan kemampuan untuk memanggil beberapa metode dengan nama yang sama tetapi jumlahnya berbeda . Lihat func_get_args dan @rajukoyilandy jawaban, kita dapat menggunakan f(x)dan f(x,y).

  • YA, menyediakan kemampuan untuk menelepon beberapa metode dengan nama yang sama tetapi jenis yang berbeda . Se menggunakan internal gettype dalam metode ini.

    • TAPI untuk referensi ... Hanya variabel yang dapat dilewati oleh referensi, Anda tidak dapat mengelola kelebihan muatan untuk deteksi konstan / variabel.
  • TIDAK menyediakan kemampuan untuk mendeklarasikan beberapa metode dengan nama yang sama tetapi jumlah yang berbeda . Ini karena kita dapat memanggil f(x)dan f(x,y)dengan fdeklarasi yang sama .

  • TIDAK menyediakan kemampuan untuk mendeklarasikan beberapa metode dengan nama yang sama tetapi tipe yang berbeda . Ini karena PHP compiler harus mengartikan f($integer,$string) sebagai fungsi yang sama itu f($string,$integer).

Lihat juga dokumentasi kelebihan PHP5 untuk penjelasan "kelebihan muatan non-tradisional".

Peter Krauss
sumber