Nie mam pojęcia co do wartości domyślnych funkcji PHP. Powiedzmy, że mam taką funkcję:
function foo($blah, $x = "some value", $y = "some other value") {
// code here!
}
A jeśli chcę użyć domyślnego argumentu dla $ x i ustawić inny argument dla $ y?
Eksperymentowałem na różne sposoby i po prostu coraz bardziej się pogubiłem. Na przykład wypróbowałem te dwa:
foo("blah", null, "test");
foo("blah", "", "test");
Ale oba nie dają prawidłowego domyślnego argumentu dla $ x. Próbowałem również ustawić to według nazwy zmiennej.
foo("blah", $x, $y = "test");
W pełni spodziewałem się, że coś takiego zadziała. Ale to wcale nie działa tak, jak się spodziewałem. Wygląda na to, że bez względu na to, co zrobię, i tak będę musiał wpisywać domyślne argumenty, za każdym razem, gdy wywołam funkcję. I chyba brakuje mi czegoś oczywistego.
foo("blah", , "test");
?Odpowiedzi:
Proponuję zmienić deklarację funkcji w następujący sposób, abyś mógł robić, co chcesz:
W ten sposób możesz wykonać wywołanie takie jak
foo('blah', null, 'non-default y value');
i sprawić, by działało tak, jak chcesz, gdzie drugi parametr$x
nadal ma swoją wartość domyślną.W przypadku tej metody przekazanie wartości null oznacza, że chcesz mieć wartość domyślną dla jednego parametru, gdy chcesz zastąpić wartość domyślną parametru, który występuje po niej.
Jak stwierdzono w innych odpowiedziach,
Jeśli mam metodę, która akceptuje różną liczbę parametrów i parametry różnych typów, często deklaruję funkcję podobną do odpowiedzi, którą pokazał Ryan P.
Oto kolejny przykład (to nie odpowiada na twoje pytanie, ale miejmy nadzieję, że jest pouczające:
źródło
null
wartości do parametru, ponieważ za każdym razem przypisywałby on wartość domyślną. Nawet jeśli miałeś inną specjalną wartość, kiedy faktycznie chcesz mieć wartość null (np. Gdy $ x == "use_null" sprawi, że $ x = null), nie będziesz w stanie przypisać takiej specjalnej wartości jak dosłowna wartość parametr (w tym przypadku ciąg „use_null”). Więc po prostu upewnij się, że używasz unikalnego, nigdy nie pożądanego „klucza”, gdy chcesz użyć wartości domyślnej (i chcesznull
być poprawną opcją)Opcjonalne argumenty działają tylko na końcu wywołania funkcji. Nie ma sposobu, aby określić wartość $ y w twojej funkcji bez określenia $ x. Niektóre języki obsługują to poprzez nazwane parametry (na przykład VB / C #), ale nie PHP.
Możesz to emulować, jeśli używasz tablicy asocjacyjnej dla parametrów zamiast argumentów - tj
Następnie wywołaj funkcję w ten sposób:
źródło
isset($args['x'])
, ponieważ obecnie zastąpiłby pusty ciąg, pustą tablicę lubfalse
wartość domyślną.$x = !array_key_exists('x',$args) ? 'default x value' : $args['x'];
Jest to rzeczywiście możliwe:
Czy chcesz to zrobić, to inna historia :)
AKTUALIZACJA:
Powody, dla których warto unikać tego rozwiązania to:
Ale w rzeczywistości może się przydać w sytuacjach, gdy:
nie chcesz / nie możesz zmienić oryginalnej funkcji.
możesz zmienić funkcję, ale:
null
(lub odpowiednik) nie jest opcją (zobacz komentarz DiegoDD )func_num_args()
Jeśli chodzi o wydajność, bardzo prosty test pokazuje, że użycie interfejsu API Reflection do uzyskania parametrów domyślnych powoduje, że wywołanie funkcji jest 25 razy wolniejsze , podczas gdy nadal zajmuje to mniej niż jedną mikrosekundę . Powinieneś wiedzieć, czy możesz z tym żyć.
Oczywiście, jeśli zamierzasz używać go w pętli, powinieneś wcześniej uzyskać wartość domyślną.
źródło
źródło
$defaults = [ 'x' => 'some value', 'y' => 'some other value'];
Jedyny sposób, w jaki mogę to zrobić, to pominięcie parametru. Jedynym sposobem na pominięcie parametru jest zmiana kolejności listy parametrów tak, aby ta, którą chcesz pominąć, znajdowała się po parametrach, które MUSISZ ustawić. Na przykład:
Następnie możesz zadzwonić do foo na przykład:
Spowoduje to:
źródło
Niedawno miałem ten problem i znalazłem to pytanie i odpowiedzi. Chociaż powyższe pytania działają, problem polega na tym, że nie pokazują one domyślnych wartości dla IDE, które je obsługują (np. PHPStorm).
jeśli użyjesz
null
, nie będziesz wiedział, jaka byłaby wartość, jeśli pozostawisz to pole puste.Preferowanym przeze mnie rozwiązaniem jest również umieszczenie wartości domyślnej w definicji funkcji:
Jedyną różnicą jest to, że muszę się upewnić, że są takie same - ale myślę, że to niewielka cena za dodatkową przejrzystość.
źródło
Nie możesz tego zrobić bezpośrednio, ale małe manipulowanie kodem umożliwia emulację.
źródło
null
w tym przypadku jest koncepcyjnie lepsze niżfalse
.false
jest bardziej ryzykownym wyborem niżnull
, ponieważ php nie jest surowym językiem.!$x
będzie prawdziwe dla kilku różnych wejść, co może zaskoczyć programistę:0
,''
. Podczas gdy znull
, możesz użyć!isset
jako ściślejszego testu.źródło
Moje 2 centy z zerowym operatorem koalescencji
??
(od PHP 7)Możesz sprawdzić więcej przykładów na mojej repl.it
źródło
Dzieje się tak, gdy obiekt jest lepszy - ponieważ możesz ustawić obiekt tak, aby trzymał x i y, ustawić wartości domyślne itp.
Podejście z tablicą jest bliskie utworzenia obiektu (w rzeczywistości obiekt to zestaw parametrów i funkcji, które będą działać na obiekcie, a funkcja pobierająca tablicę będzie działać na niektórych parametrach)
Z pewnością zawsze możesz zrobić kilka sztuczek, aby ustawić wartość null lub coś podobnego jako domyślnego
źródło
Możesz również sprawdzić, czy masz pusty ciąg jako argument, aby móc wywołać:
foo('blah', "", 'non-default y value', null);
Poniżej funkcji:
To nie ma znaczenia, jeżeli wypełni
null
lub""
, będzie wciąż ten sam rezultat.źródło
Przekaż do funkcji tablicę zamiast poszczególnych parametrów i użyj operatora łączącego wartość null (PHP 7+).
Poniżej przekazuję tablicę z 2 elementami. Wewnątrz funkcji sprawdzam, czy ustawiona jest wartość item1, jeśli nie jest przypisana domyślna przechowalnia.
źródło
$args['item1'] = $args['item1']??'default value';
w PHP 7+. jeśli $ args ['item1'] ma wartość null, todefault value
string zostanie przypisany do $ args ['item1']