PHP yöntemleri aşırı miyim?

6 Cevap php

Örnek:

Ben iki farklı kurucular olmasını istiyorsanız, ve daha sonra mümkün ne args görünmez çünkü ben, func_get_args () kullanmak istemiyorum.

Sanki ikisini yazmak için yasal mı:

class MyClass {
    public function __construct() {
    // do something
    }
    public function __construct(array $arg) {
    // do something
    }
}

?

6 Cevap

Hayır, ama bunu yapabilirsiniz:

class MyClass {
    public function __construct($arg = null) {
        if(is_array($arg)) {
            // do something with the array
        } else {
            // do something else
        }
    }
}

PHP, bir işlevi herhangi bir sayıda alabilir ve bunları varsayılan bir değer verirseniz onlar tanımlanmış olması gerekmez. Bu 'sahte' işlevi yüklenme ve farklı argümanlarla işlevlerine erişmek izin nasıl olduğunu.

PHP (bu "aşırı yüklenme" olarak adlandırdığı şey vardır __call magic method), but what really happens is the magic method __call çağrıldığında üzerinden oldukça zaman __get ve {[gibi ulaşılmaz ya da var olmayan bir yöntem, ( 3)]} siz "erişim" ulaşılmaz / varolmayan özellikleri. Siz olmayan sihirli yöntemlerin aşırı yüklenmesini uygulamak için kullanabilirsiniz izin, ama hantal değil.

Formal parametreleri Türlenmemiş (bu are yazdığınız beri, türlenmemiş olma argüman değerleri farklı olan) ve hatta fonksiyon Arity kesinlikle (her fonksiyon argümanları asgari sayıda zorlanmaz, ancak hiçbir teorik olabilir gibi ) maksimum, aynı zamanda farklı bir sayı ve tür bağımsız değişkenleri işlemek için yöntem vücut yazabilirsiniz.

Hayır, bunu yapamazsın.

Bu görünmez args sorunu çözmek için, ancak, mümkün değil, reflection class kullanabilirsiniz.

if(count($args) == 0)
  $obj = new $className;
else {
 $r = new ReflectionClass($className);
 $obj = $r->newInstanceArgs($args);
}

PHP bir zayıf yazarak dil ve argüman değişken sayıda (sözde varargs) ile işlevlerini destekler beri aynı adı bile ilan argümanların farklı sayıda (tüm işlevleri olan iki fonksiyon arasında işlemciye fark yoktur varargs). Yani, aşırı yükleme tasarım yasaktır.

Sizin yöntemi / fonksiyonu için kafa karıştırıcı bir arayüz neden olsa da, func_get_args() pseudo-aşırı işlevler oluşturmak için kullanabilirsiniz.