2009-10-02 34 views
19

, bu şekilde kullanılabilir:PHP işlevi aşırı yükleme nedir? aşırı Java gibi dillerde

void test($foo, $bar){} 
int test($foo){} 

Sonra test() 2 ile argümanlar test($x, $y); ıla örneğin denilen eğer, ilk işlevi çağrılmalıdır olacaktır. Sadece 1 argümanını geçtiyseniz, örneğin test($x);, 2. fonksiyon çağrılır.

Kılavuzdan, php 5'in aşırı yüklenmesi gibi görünüyor, ama bunun için ne var? Bu konuyla ilgili kılavuzu anlayamıyorum ..

+0

Ayrıca bkz [Neden PHP işlevlerin desteklemiyor?], basitçe parametre varsayılan olarak olarak boş geçmek yapmak bir işlev yüklemek için (http://programmers.stackexchange.com/a/190550/ 84.349). –

+0

Bu bağlantıda indirilebilir sınıfı kullanabilirsiniz: http://stackoverflow.com/questions/4697705/php-function-overloading/27231803#27231803 –

cevap

25

PHP's meaning of overloading, Java'nınkinden farklıdır. PHP'de aşırı yükleme, __get, __set, __set, __call, __callStatic gibi, some of the __magic methods'u uygulayarak çalışma zamanında nesne üyelerini ekleyebileceğiniz anlamına gelir. Yeni üyelerle nesneleri yüklersiniz. PHP'de Aşırı yükleme

dinamik özellikleri ve yöntemleri "oluşturmak" için araçlar sağlar. Bu dinamik varlıklar, çeşitli işlem türleri için bir sınıfta kurabilen sihirli yöntemlerle işlenen 'dır.

Bir örnek:

class Foo 
{ 
    public function __call($method, $args) 
    { 
     echo "Called method $method"; 
    } 
} 

$foo = new Foo; 

$foo->bar(); // Called method bar 
$foo->baz(); // Called method baz 

Ve bu arada

PHP PHP 4.3.0 yana aşırı bu tür destekler. Tek fark, PHP 5'ten önceki sürümlerde, overload() işlevini kullanarak aşırı yüklemeyi açıkça etkinleştirmeniz gerektiğidir.

+0

Bu tür aşırı yükleme türlerinin olası avantajları neler olabilir? ?? –

+8

'__call()' ın çok yararlı olduğu kanıtlanmış bir senaryo, bir para birimi dönüştürücü sınıfı oluşturduğum zamandı. '$ Converter->' ı çevirmek yerine (2, 'EUR', 'USD'), '' $ converter-> convertEurToUsd (2); 'diyebilirsiniz, ki bu benim görüşüme göre çok daha okunabilir. Kaynaklarıma bir göz atabilirsiniz: http://github.com/igstan/php-utils/blob/master/tests/CurrencyConverterTest.php http://github.com/igstan/php-utils/blob/master/ src/CurrencyConverter.php –

+2

Veritabanıma dinamik LINQ benzeri bir arabirim için bu yöntemi kullanıyorum. Böylece $ db-> Select ('table') -> col_1 [$ value] -> col_2 [$ value] -> Merge ('col_1'); Yani tüm __calls(). Doğru işleme sınıfına geçilir (ör. SQL, Dosya, Xml). – null

14

Eğer Java gibi bir işlevi aşırı koyan iddialarda belirtmeyen ve argümanlar veya bu işleve geçirildi argümanları kendileri sayısını almak için func_num_args ve func_get_args işlevini kullanın isterseniz:

function test() { 
    $args = func_get_args(); 
    switch (count($args)) { 
     case 1: 
      // one argument passed 
      break; 
     case 2: 
      // two arguments passed 
      break; 
     default: 
      // illegal numer of arguments 
      break; 
    } 
} 
-1

üzerinde

class ParentClass 
{ 
    function mymethod($arg1 = null, $arg2 = null, $arg3 = null) 
    { 
    if($arg1 == null && $arg2 == null && $arg3 == null){ 
     return 'function has got zero parameters <br />'; 
    } 
    else{ 
     $str = ''; 
     if($arg1 != null) 
     $str .= "arg1 = ".$arg1." <br />"; 

     if($arg2 != null) 
     $str .= "arg2 = ".$arg2." <br />"; 

     if($arg3 != null) 
     $str .= "arg3 = ".$arg3." <br />"; 

     return $str; 
     } 
    } 
} 

// and call it in order given below ... 

$obj = new ParentClass; 

echo '<br />$obj->mymethod()<br />'; 
echo $obj->mymethod(); 

echo '<br />$obj->mymethod(null,"test") <br />'; 
echo $obj->mymethod(null,'test'); 

echo '<br /> $obj->mymethod("test","test","test")<br />'; 
echo $obj->mymethod('test','test','test'); 
İlgili konular