Uwielbiam robić tego typu rzeczy w Perlu: $foo = $bar || $baz
przypisanie $baz
do $foo
jeżeli $bar
jest pusta lub nieokreślona. Trzeba również $foo ||= $bletch
który przypisze tylko $bletch
na $foo
razie $foo
nie jest zdefiniowana lub pusty.
Operator trójskładnikowy w tej sytuacji jest żmudny i męczący. Z pewnością w PHP dostępna jest prosta, elegancka metoda?
A może jedyną odpowiedzią jest funkcja niestandardowa, która używa isset ()?
php
perl
operators
default-value
Tom Auger
źródło
źródło
//
i//=
istnieją od wersji Perl 5.0.0. Oryginał||
i||=
test pod kątem wartości logicznej, a nie zdefiniowania.Odpowiedzi:
W PHP 7 wreszcie mamy sposób, aby zrobić to elegancko. Nazywa się to operatorem koalescencji zerowej . Możesz go używać w ten sposób:
$name = $_GET['name'] ?? 'john doe';
Jest to równoważne z
$name = isset($_GET['name']) ? $_GET['name']:'john doe';
źródło
<=>
i całkiem dokładna!null
wartości. Na przykład, jeśli$_GET['name']
jest ustawiony na pusty ciąg, pierwsza linia zwróci pusty ciąg, ale możemy zwrócić „john doe” za pomocą$_GET['name'] ? $_GET['name'] : 'john doe'
.PHP 5.3 ma
?:
operator skrótu :$foo = $bar ?: $baz;
Który przypisuje,
$bar
jeśli nie jest to pusta wartość (nie wiem, jak różniłoby się to w PHP od Perla), w przeciwnym razie$baz
i jest taki sam jak w Perlu i starszych wersjach PHP:$foo = $bar ? $bar : $baz;
Ale PHP nie ma do tego celu złożonego operatora przypisania (to znaczy nie ma odpowiednika Perla
||=
).Ponadto PHP będzie hałasować, jeśli
$bar
nie jest ustawione, chyba że wyłączysz powiadomienia. Istnieje również różnica semantyczna międzyisset()
iempty()
. Pierwsza zwraca false, jeśli zmienna nie istnieje lub jest ustawiona naNULL
. Te ostatnie Zwraca true, jeśli nie istnieje, lub jest ustawiony na0
,''
,false
lubNULL
.źródło
The first returns
zamiastThe second
w przedostatnim zdaniu.$var = isset($var) ? $var : 'default value';
Mówi, że w odpowiedzi ... po prostu wskazuję to ponownie każdemu, kto go przejrzy. :-DDzięki za wszystkie świetne odpowiedzi!
Dla każdego, kto przychodzi tutaj po ewentualną alternatywę, oto kilka funkcji, które pomagają usunąć nudę z tego rodzaju rzeczy.
function set_if_defined(&$var, $test){ if (isset($test)){ $var = $test; return true; } else { return false; } } function set_unless_defined(&$var, $default_var){ if (! isset($var)){ $var = $default_var; return true; } else { return false; } } function select_defined(){ $l = func_num_args(); $a = func_get_args(); for ($i=0; $i<$l; $i++){ if ($a[$i]) return $a[$i]; } }
Przykłady:
// $foo ||= $bar; set_unless_defined($foo, $bar); //$foo = $baz || $bletch $foo = select_defined($baz, $bletch);
Jestem pewien, że można to poprawić.
źródło
Popularnym idiomem zapewniającym zgodność ze starszymi wersjami PHP jest:
$var = $bool or $var = "default"; // If I use it, then only with excessive spaces for clarity.
Działa to dla wartości, które mogą być oceniane w kontekście logicznym. Zaletą jest to, że daje to również e_notice do debugowania, jeśli zmienna jest niezdefiniowana.
źródło
$bool ? $bool : "default"
if$bool
nie jest zdefiniowane?isset($var) ? $var : DEFAULT
. Ale wygląda na to, że i tak chce ich unikać.W PHP wcześniejszych niż 7. * można użyć?: Dla niezdefiniowanej zmiennej, której błędy są lokalnie pomijane przez
@
:$foo = @$bar ?: $baz;
źródło
to kolejny dobry format
isset
sprawyisset($foo) || $foo= $bar;
inny prosty sposób i da ci większą kontrolę, ponieważ możesz dodać więcej warunków i przypisać je do innej zmiennej w tym samym czasie
$foo = (isset($oData['foo']))?$bar['foo']:'default value';
źródło
Możliwe rozwiązanie: defaultFor ()
Jeśli nie mamy rozwiązania fabrycznego (co jest rzeczywiście bardzo irytujące), poleciłbym poniższego małego pomocnika. W większości przypadków spełnia swoje zadanie:
function defaultFor(&$x,$default=null) { if(!isset($x)) $x = $default; } //-------------------- Now you can do this: -------------- defaultFor($a,"Jack"); // if $a is not set, it will be "Jack" defaultFor($x); // no more notices for $x but keep it !isset
Mam nadzieję, że jest to blisko tego, co chciałeś osiągnąć. Nie da ci żadnych powiadomień, jeśli użyjesz go z nieistniejącą zmienną i jest to całkiem wygodne. Z pewnością ma wadę: wartość domyślna zawsze jest obliczana z góry, więc nie używaj jej z niczym ciężkim jako drugim parametrem, jak file_get_contents lub coś w tym rodzaju. W takich przypadkach lepiej jest setingować.
źródło
Myślę, że ogólnie robię coś takiego:
jest to zły pomysł, chyba że
$bar
i$baz
to zarówno wartości logiczne. Jeśli nie:$bar = 10; $baz = 11;
wtedy pojawia się pytanie: co decyduje o tym, czy coś jest prawdziwe, czy fałszywe? Większość ludzi prawdopodobnie spodziewałaby się, że zero będzie fałszywe, a wszystko inne będzie prawdziwe. Ale z niektórymi językami (na przykład Ruby), tylko
false
inil
są fałszywe, co oznacza oba te języki0
i1
byłoby prawdą. Z powodu tej dwuznaczności międzyjęzykowej myślę, że najlepiej będzie wyrazić się jasno w tych przypadkach:if ($bar !== 0) { $foo = $bar; } else { $foo = $baz; }
lub:
$foo = $bar !== 0 ? $bar : $baz;
źródło