2010-09-17 9 views
17

Zasadniczo chciałbym móc zdefiniować zmienną jako jedną rzecz, chyba że coś takiego nie istnieje. Przysięgam, że gdzieś widziałem skrótowej warunkowych, które wyglądały mniej więcej tak:Skrócona warunkowa definicja zmiennej na podstawie istnienia innej zmiennej w PHP

$var=$_GET["var"] || "default"; 

Ale nie mogę znaleźć żadnej dokumentacji do wykonania tego prawa, i szczerze to mogło być JS lub ASP lub coś gdzie widziałem go .

Rozumiem, że wszystko, co powinno się dziać w powyższym kodzie, to po prostu sprawdzenie, czy którekolwiek z tych instrukcji zwraca wartość true. Ale myślałem, że widziałem, jak ktoś zrobił coś, co w zasadzie zdefiniowało domyślne, jeśli pierwsze zawiodło. Czy jest to coś, o czym każdy wie i może mi pomóc? Czy jestem szalony? Po prostu wydaje się zbędne powiedzieć:

$var=($_GET["var"]) ? $_GET["var"] : "default"; 

lub szczególnie zbędne powiedzieć:

if ($_GET["var"]) { $var=$_GET["var"]; } else { $var="default"; } 

myśli?

+0

Tak, to głupi php nie może tego zrobić, każdy wie, czy może to zrobić od 5.6? –

+1

@DominicTobias Przyjęta odpowiedź działa w 5.3+ –

+0

Możliwy duplikat [Ustawianie wartości domyślnych (przypisanie warunkowe)] (http://stackoverflow.com/questions/163092/setting-default-values-conditional-assignment) –

Odpowiedz

14

Matthew wspomniał już o jedynym sposobie wykonania tego w PHP 5.3. Należy pamiętać, że można również je Łańcuch:

$a = false ?: false ?: 'A'; // 'A' 

To nie jest takie samo jak:

$a = false || false || 'A'; // true 

Przyczyną jest to, że PHP jest jak najbardziej tradycyjnych języków w tym aspekcie. Logiczne OR zawsze zwraca true lub false. Jednak w JavaScript używane jest wyrażenie końcowe. (W serii OR będzie to pierwsza nieprawda.)

var a = false || 'A' || false; // 'A' 
var b = true && 'A' && 'B'; // 'B'; 
+0

Inny Mateusz usunął odpowiedź, ponieważ nie podobało mu się to, że odpowiedź nie była zgodna z jego osobistymi najlepszymi praktykami, więc je usunął. Dlatego zaznaczam to jako poprawne, ponieważ rozszerza się ono na oryginalną odpowiedź. Dla przypomnienia, inne obawy Matthew są wyrażone w odpowiedzi Fanis. Są to ważne obawy, ale odpowiedź na moje pytanie brzmi "?:", Jak pokazano tutaj. –

7

W takich przypadkach powinieneś sprawdzić, czy istnieje zmienna w $ _GET, a następnie, czy jest ona ważna dla twoich parametrów. Na przykład:

$var = (isset($_GET["var"]) && $_GET['var'] !== '') ? $_GET["var"] : "default"; 

Bardzo szybko może to być dość nieczytelne. Powiedziałbym zachować czytelny najpierw inicjuje zmienną do bezpiecznego domyślnie, a następnie nadpisanie że z jednego zewnętrznego, jeśli to ważne:

$var = "default"; 
if (isset($_GET['var') && $_GET['var'] !== '') { 
    $var = $_GET['var] ; 
} 

Jak na pierwszy przykład $var=$_GET["var"] || "default"; istnieje w JavaScript: var someVar = incomingVar || "default";

+0

@Ben, to prawdopodobnie powinna być akceptowana odpowiedź. Trochę dłużej, ale unika ostrzeżeń. Również kontrola przeciwko! == '' tak naprawdę nie dotyczy istnienia, chociaż może być przydatna w niektórych przypadkach. –

+0

@MatthewFlaschen Nie odpowiada to jednak na pytanie, które miałem. Podnosi uzasadnione obawy, więc go przegłosowałem. Ale pytanie brzmiało, czy istnieje sposób, aby osiągnąć to, co zrobiłeś, skrót. –

2

Zawsze używałem pustych.

$var = !empty($_GET['var'])?$_GET['var']:'default'; 
+0

Przypuszczam, że jeśli używasz $ _GET, nigdy nie otrzymasz odpowiedzi boolowskiej, więc 'empty' jest nieodróżnialne od' isset', ale wydaje się, że jest to gorszy sposób, aby zrobić to w innych sytuacjach: '$ var =! Empty ($ other_var)? $ other_var: true' spowoduje, że $ var * always * będzie równe true. Chociaż, jak sądzę, podobnie będzie w notacji JS 'var = other_var || true'. –

Powiązane problemy