PHP: Nasıl ebeveyn, çocuk sınıf __ construct () argüman KATKISI :: __construct (?)

4 Cevap php

Öyle gibi PHP bir sınıf var:

class ParentClass {
    function __construct($arg) {
        // Initialize a/some variable(s) based on $arg
    }
}

Bu gibi, bir çocuğun sınıf vardır:

class ChildClass extends ParentClass {
    function __construct($arg) {
        // Let the parent handle construction. 
        parent::__construct($arg); 
    }
}

Ne olur, nedense, EbeveynSınıf ben "her ihtimale karşı" sağlamak için benim çocuk sınıf istiyorsunuz birden fazla isteğe bağlı argüman almak için değiştirmek gerekiyor? Ben çocuğu olarak yeniden kod sürece, sadece hiç kurucu bir argüman alacak ve sadece hiç bu bir argüman geçecek.

Bu olağan durumda bir çocuğu olarak farklı bir argüman alan bir EbeveynSınıf devralmasını gerek ki böylece nadir ya da böyle kötü bir uygulama mı?

Esasen, ben seni somefunction(*args) 'args' çeşit bir dizi / iterable nerede üzerinden bir işleve argümanlar bir potansiyel olarak bilinmeyen numara geçmek nerede Python gördüm. Does something like this exist in PHP? Ya ben geçmeden önce bu sınıflar refactor?

4 Cevap

Php böyle bir şey biraz ayrıntılı olsa da, var:

$args = func_get_args();
call_user_func_array(array($this, 'parent::__construct'), $args);

Eğer php iç içe sınırı hatası alırsanız, bu deneyin:

$args = func_get_args();
call_user_func_array(array('parent', '__construct'), $args);

Php.net bu işlevleri göz atın:

func_get_args
func_num_args

İsteğe bağlı bir argüman yapmak istiyorsanız Ayrıca, bunu yapabilirsiniz:

class ParentClass {
    function __construct($arg, $arg2="Default Value") {
        // Initialize a/some variable(s) based on $arg
    }
}

Evet, o ebeveynden farklı yapıcı argümanları kullanan bir çocuğun sınıf yapmak için oldukça kötü bir uygulamadır. Özellikle kötü desteklenen PHP gibi bir dil.

Tabii ki, PHP "biz hiç isteyebilirsiniz ne argümanlar" bir dizi geçmek için genel yolu yapılandırma değerlerini bir dizi oluşan tek bir argüman geçmektir.