2009-10-02 15 views
19

W językach takich jak Java, przeciążenia mogą być używane w ten sposób:Do czego służy przeciążanie funkcji PHP?

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

Następnie jeśli nazywa test() z 2 argumenty np test($x, $y);, pierwsza funkcja zostanie wywołana. Jeśli przekazałeś tylko 1 argument, np. test($x);, wywołana zostanie druga funkcja.

Z instrukcji wydaje się, że php 5 ma przeciążenie, ale po co to jest? Nie mogę zrozumieć instrukcji na ten temat ..

+0

Zobacz również [Dlaczego PHP nie obsługuje przeciążania funkcji?] (http://programmers.stackexchange.com/a/190550/ 84349). –

+0

Możesz użyć klasy przeciążeniowej w tym łączu: http://stackoverflow.com/questions/4697705/php-function-overloading/27231803#27231803 –

Odpowiedz

25

PHP's meaning of overloading jest inny niż Java. W PHP przeciążanie oznacza, że ​​użytkownik może dodawać elementy obiektu w czasie wykonywania, implementując some of the __magic methods, np. __get, __set, __call, __callStatic. Załadujesz obiekty z nowymi członkami.

przeciążeniem PHP zapewnia środki do dynamiczne „tworzenia” właściwości i metod. Te dynamiczne jednostki są przetwarzane za pomocą magicznych metod, które można ustawić w klasie dla różnych typów akcji .

Przykład:

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

$foo = new Foo; 

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

A tak przy okazji, PHP obsługuje tego rodzaju przeciążenia od PHP 4.3.0. Jedyna różnica polega na tym, że w wersjach poprzedzających PHP 5 trzeba było jawnie aktywować przeciążanie za pomocą funkcji overload().

+0

Jakie mogą być ewentualne zalety tego typu przeciążenia, którego przykład podałeś? ?? –

+8

Jeden ze scenariuszy, w którym '__call()' okazał się bardzo przydatny, to kiedy zbudowałem klasę konwertera walut. Zamiast wywoływać '$ converter-> convert (2, 'EUR', 'USD');' możesz nazwać '$ converter-> convertEurToUsd (2);', co jest o wiele bardziej czytelne według mnie. Możesz rzucić okiem na moje źródła: http://github.com/igstan/php-utils/blob/master/tests/CurrencyConverterTest.php http://github.com/igstan/php-utils/blob/master/ src/CurrencyConverter.php –

+2

Używam tej metody do dynamicznego interfejsu podobnego do LINQ do mojej bazy danych. Mogę robić rzeczy takie jak $ db-> Select ('table') -> col_1 [wartość $] -> col_2 [wartość $] -> Merge ('col_1'); Tak więc wszystkie __calls(). Przejście do właściwej klasy obsługi (tj. SQL, File, Xml). – null

14

Jeśli chcesz przeciążyć funkcję jak w Javie, nie określają żadnych argumentów i użyć funkcji func_num_args i func_get_args aby uzyskać liczbę argumentów lub samych argumentów, które zostały przekazane do tej funkcji:

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

ponad załadować funkcji po prostu przechodzą parametr za nieważną domyślnie

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');