PHP neden işlev aşırı yüklemeyi desteklemiyor?


37

Bir programlama dilinin temel özelliklerinden birinin, işlevleri argümanlarla aşırı yükleme yeteneğine sahip olup olmadığını merak ediyorum. Nesne yönelimli programlama bağlamında zorunlu olduğunu düşünüyorum.

Kasıtlı olarak geride bırakılıp izin verilmiyor mu? Yoksa aşırı yükleme iyi bir uygulama değil midir?


27
İşlev aşırı yüklemesi gerçekten OO programlamanın bir özelliği değildir. Polimorfizm amacıyla aşırı sınıflandırma yapan alt sınıf fonksiyon , genellikle OO'nun gerekli bir özelliği olarak kabul edilir - ancak argümanlara dayanarak fonksiyonun aşırı yüklenmesi değildir. Python'da argüman temelli fonksiyon aşırı yüklemesi de yoktur. Her neyse, fonksiyonun aşırı yüklenmesi, fonksiyon derlemesinin derleme zamanında gerçekleştiği ve her bir fonksiyon parametresinin türüne bağlı olduğu statik olarak yazılmış dillerde daha pratiktir.
Charles Salvia

2
@ CharlesSalvia Bu iyi bir cevap olurdu.
kiamlaluno

1
O ne dedi. Ayrıca, fonksiyonun aşırı yüklenmesi de abartılmıştır. Farklı işlevler için aynı işlev adını kullanmanız gerekmez; sadece fonksiyonlarınıza benzer fakat aynı olmayan isimler verin. Operatör aşırı
yükleniyor

Her ne kadar belirli bir sorunun cevabı olmasa da , PHP’de aşırı yüklenmeyi kullanmak için NASIL daha iyi anlamamı sağlayan bu bağlantıyı göndereceğim. yardımcı olur umarım
DiegoDD

Yanıtlar:


33

PHP'nin aşırı fonksiyonu desteklemediğini kim söyledi? !!!

Aslında PHP, fonksiyonların aşırı yüklenmesini destekliyor ancak farklı bir şekilde. PHP'nin aşırı yükleme özellikleri Java'nınkinden farklı:

PHP'nin "aşırı yükleme" yorumu çoğu nesne yönelimli dilden farklıdır. Geleneksel olarak aşırı yükleme yapmak, aynı adda ancak farklı miktarlarda ve türlerde argümanlarla birden fazla yönteme sahip olma yeteneği sağlar.

Aşağıdaki kod bloklarını kontrol edin.

N sayısının toplamını bulma işlevi:

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

İki sayı ekleme veya iki dizeyi birleştirme işlevi:

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

Aşırı Yüklenme İçeren Nesneye Yönelik Yaklaşım:

PHP'de aşırı yükleme, dinamik olarak özellikleri ve yöntemleri "oluşturmak" için araçlar sağlar. Bu dinamik varlıklar, çeşitli eylem tipleri için bir sınıfta oluşturabilecekleri sihirli yöntemler ile işlenir.

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

PHP, sen gibi sihirli yöntemlerden bazılarını uygulayarak, çalışma anında nesne üye ekleyebilir aracı aşırı yükleme __set, __get, __callvb

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
PHP'nin "aşırı yükleme" dediği şeyle ilgili ikinci bit, hepsi o kadar da değil. Sadece PHP, çoğunlukla farklı bir şey için iyi kurulmuş bir isim kullanıyor, PHP olduğu düşünüldüğünde, bu şaşırtıcı değil.
phant0m

10
Bu fonksiyon aşırı yükleme değildir. Bir işlevi gerçekten aşırı yüklemek için, şimdi php'ye eşdeğerini yazın findSum(10, "steve", { 86, "2012-09-20" });. Gerçek bir aşırı yükleme, farklı tiplerde yeni parametrelere izin verir.
Joel Etherton

3
@JoelEtherton - PHP'nin "aşırı yükleme" yorumu çoğu nesne yönelimli dilden farklıdır. Geleneksel olarak aşırı yükleme yapmak, aynı adda ancak farklı miktarlarda ve türlerde argümanlarla birden fazla yönteme sahip olma yeteneği sağlar. ref: http://php.net/manual/tr/language.oop5.overloading.php PHP'de aşırı yükleme, dinamik olarak özellikleri ve yöntemleri "oluşturmak" için araçlar sağlar. Bu dinamik varlıklar, çeşitli eylem tipleri için bir sınıfta oluşturabilecekleri sihirli yöntemler ile işlenir.
rajukoyilandy 20:12

7
@ rajukoyilandy: Her şey yolunda ve güzel, ancak OP'nin sorusu PHP'nin neden "geleneksel" aşırı yüklemeyi uygulamadığını soruyor. Cevabınız buna değinmiyor.
Joel Etherton

7
Bu aşırı yüklenmiyor. Fonksiyonun hala sadece bir tanımı / bildirimi var. Bu, C ++ 'ta va_list / va_arg değerine eşittir. Aynı problemlerden bazılarını çözebilir misiniz? Evet. Ama yine de aşırı yüklenmiyor.
Luke

13

Değil bir "Geleneksel struct" tam destek, sadece kısmi .

TANIM : "Geleneksel Aşırı Yükleme", yöntem çağırırken , aynı ada sahip ancak farklı miktar ve argüman türlerinde birden fazla yönteme sahip olma yeteneği sağlar. Yöntem bildirimi için , aşırı yüklenmiş her işlev için ayrı / yalıtılmış bir bildirimi ifade etme seçeneği sunar.

Not: Bu tanım ikinci kısmı genellikle ilişkilidir statik olarak yazılan tür denetlemesi ve / veya yapmak programlama dilleri Arity denetimi doğru bildirimde seçmek. PHP statik olarak yazılmış bir dil değildir, dinamiktir ve zayıf yazmayı kullanır .


PHP DESTEĞİ :

  • EVET, aynı isimde fakat farklı miktarlarda çoklu metot çağırma yeteneği sağlar . Bkz func_get_args ve @rajukoyilandy cevap kullanabileceğimiz ve .f(x)f(x,y)

  • EVET, aynı isimde fakat farklı tiplerde çoklu metot çağırma özelliği sağlar . Metotta gettype dahili kullanımı .

    • AMAÇ referanslar için ... Yalnızca değişkenler referans ile iletilebilir, sabit / değişken tespiti için aşırı yüklenmeyi yönetemezsiniz.
  • NOT , aynı adda ancak farklı miktarlarda birden fazla yöntem bildirme olanağı sağlar . Arayabileceğimiz Bunun nedeni ve aynı ile beyanı.f(x)f(x,y)f

  • NOT , aynı ada sahip ancak farklı türlerde birden fazla yöntem bildirme olanağı sağlar . Bunun sebebi PHP derleyicisinin aynı fonksiyonla yorumlanması gerektiğidir .f($integer,$string)f($string,$integer)

Ayrıca "geleneksel olmayan aşırı yükleme" açıklamaları için PHP5 aşırı yükleme belgelerine bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.