2012-03-02 12 views
6

Powiel możliwe:
Any way to specify optional parameter values in PHP?funkcja PHP - ignorować niektórych parametrów domyślnie

tylko przypadkowo natknąłem się na to.

Jeśli mam funkcję tak:

public function getSomething($orderBy='x', $direction = 'DESC', $limit=null){ 

//do something random 

} 

Po wywołaniu funkcji możliwe jest zignorować pierwsze dwa pola i pozostawić je domyślne jeszcze określić 3rd.

Na przykład:

$random = $this->my_model->getSomething(USE_DEFAULT, USE_DEFAULT, 10); 

wiem, że mogę przekazać 1 i 2 parametrów, ale wszystko im wywoławcza jest, jeśli ich jest jakiś szczególny słowa kluczowego, które właśnie mówi użyć wartości domyślnej.

Mam nadzieję, że ma to sens. to nie jest problem, tylko ciekawy.

dziękuję za przeczytanie

+0

dziękuję wszystkim za twoje wejście :) – fl3x7

+0

Możesz użyć Syntactic, aby zignorować domyślny parametr podczas wywoływania funkcji lub metod zajęć https://github.com/topclaudy/php-syntactic – cjdaniel

Odpowiedz

11

Trzeba to zrobić samemu. Można użyć null, aby wskazać, że wartość domyślna powinny być używane:

public function getSomething($orderBy = null, $direction = null, $limit = null) { 
    // fallbacks 
    if ($orderBy === null) $orderBy = 'x'; 
    if ($direction === null) $direction = 'DESC'; 

    // do something random 
} 

Następnie przechodzą null podczas wywoływania go, aby wskazać, że chcesz użyć ustawień domyślnych:

$random = $this->my_model->getSomething(null, null, 10); 

Innym możliwym rozwiązaniem którego używam czasami jest dodatkowym parametrem na samym końcu listy parametrów, zawierającej wszystkie opcjonalne parametry:

public function foo($options = array()) { 
    // merge with defaults 
    $options = array_merge(array(
     'orderBy' => 'x', 
     'direction' => 'DESC', 
     'limit'  => null 
    ), $options); 

    // do stuff 
} 

W ten sposób nie trzeba podawać wszystkich opcjonalnych argumentów. array_merge() zapewnia, że ​​zawsze masz do czynienia z pełnym zestawem opcji. Można by użyć go w ten sposób:

$random = $this->my_model->foo(array('limit' => 10)); 

Wydaje się, że nie ma wymaganego parametr ten konkretny przypadek, ale jeśli zajdzie taka potrzeba, po prostu dodaj go przed opcjonalne:

public function foo($someRequiredParameter, $someOtherRequiredParameter, $options = array()) { 
    // ... 
} 
+0

Syntactic oferuje eleganckie podejście do tego. Sprawdź to tutaj https://github.com/topclaudy/php-syntactic – cjdaniel

-2

Nie można ignorować parametrów. Ale można zrobić coś takiego:

public function getSomething($limit=null){ 

return $this->getSomething('x','DESC',$limit); 

} 


public function getSomething($orderBy='x', $direction = 'DESC', $limit=null){ 

... 

} 

zobaczyć ya

+2

Nie, nie może. PHP nie obsługuje przeciążania. – jwueller

1

Szczerze mówiąc, staje się to problemem, gdy funkcje próbują robić zbyt wiele. Prawie zawsze istnieje lepszy wzorzec projektowy, gdy widzisz, że funkcja rozwija się do więcej niż kilku parametrów (zwykle to biedny facet odziedziczył stary kod, a dołączanie parametrów to najszybszy sposób na "wykonanie zadania").

odpowiedź nieuchwytny jest najlepszy według Twojego pytania, ale przyjrzeć cyclomatic złożoności: http://en.wikipedia.org/wiki/Cyclomatic_complexity

Jest to dobry sposób, aby wiedzieć, czy funkcja robi zbyt wiele, co sprawia, że ​​zapytanie mniej problem, niż prawdopodobnie teraz.

+0

Dokładnie. Każdy powinien pamiętać o złożoności. +1! – jwueller

+0

Dzięki za to. Przeczyta to :) – fl3x7

Powiązane problemy