2012-08-25 12 views
24

Rozglądam się za poszerzeniem mojej wiedzy o PHP i natknąłem się na coś, czego nie jestem pewien, co to jest i jak go szukać. Patrzę na kod isset php.net i widzę isset($_GET['something']) ? $_GET['something'] : ''

Rozumiem normalne operacje na issetach, takie jak if(isset($_GET['something']){ If something is exists, then it is set and we will do something }, ale nie rozumiem?, Powtarzając ponownie, "lub". Czy ktoś może mi pomóc rozwiązać ten problem, a przynajmniej wskazać mi właściwy kierunek?

+2

związane http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol- mean-in-php – Musa

+1

możliwy duplikat [Czym jest PHP? : operator zadzwonił i co robi?] (http://stackoverflow.com/questions/1080247/what-is-the-php-operator-called-and-what-does-it-do) – Niko

Odpowiedz

50

Jest powszechnie określany jako "stenograficzny" lub Ternary Operator.

$test = isset($_GET['something']) ? $_GET['something'] : ''; 

oznacza

if(isset($_GET['something'])) { 
    $test = $_GET['something']; 
} else { 
    $test = ''; 
} 

rozbicie go:

$test = ... // assign variable 
isset(...) // test 
? ... // if test is true, do ... (equivalent to if) 
: ... // otherwise... (equivalent to else) 

albo ...

// test --v 
if(isset(...)) { // if test is true, do ... (equivalent to ?) 
    $test = // assign variable 
} else { // otherwise... (equivalent to :) 
1

? nazywa się Ternary (warunkowe) operator: example

6

To się nazywa operator trójskładnikowy i jest używany głównie zamiast instrukcji if-else.

Na przykład dałeś może być używany do pobierania wartości z tablicy podanej isset zwraca true

isset($_GET['something']) ? $_GET['something'] : '' 

jest równoważna

if (isset($_GET['something'])) { 
    $_GET['something']; 
} else { 
    ''; 
} 

Oczywiście to nie jest dużo używać, chyba przypisać do czegoś, a nawet przypisać wartość domyślną dla przesłanej przez użytkownika wartości.

$username = isset($_GET['username']) ? $_GET['username'] : 'anonymous' 
4

Napotkano numer ternary operator. Jego celem jest podstawowa instrukcja if-else. Poniższe fragmenty kodu robią to samo.

Ternary:

$something = isset($_GET['something']) ? $_GET['something'] : "failed"; 

if-else:

if (isset($_GET['something'])) { 
    $something = $_GET['something']; 
} else { 
    $something = "failed"; 
} 
3

z PHP 7 można napisać to jeszcze krócej:

$age = $_GET['age']) ?? 27; 

A to oznacza, jeśli wiek param jest w url zostanie on ustawiony na $age var lub domyślnie 27

Zobacz wszystkie new features of php 7

1

Jeśli chcesz pusty domyślny ciąg następnie preferowanym sposobem jest jeden z nich (w zależności od potrzeb):

$str_value = strval($_GET['something']); 
$trimmed_value = trim($_GET['something']); 
$int_value = intval($_GET['somenumber']); 

Jeśli parametr url somethingnie istnieje w url następnie $_GET['something']powróci null

strval($_GET['something']) ->strval(null) ->""

$value i zmienna jest ustawiona na pusty ciąg.

  • trim() może być preferowane przez strval() zależności od kodu (np parametr Nazwa może chcieć go użyć)
  • intval() jeśli spodziewane są tylko wartości liczbowe i domyślnie jest zero. intval(null) ->0

Sprawy do rozważenia:

...&something=value1&key2=value2 (typowy)

...&key2=value2 (parametr brakuje url $ _GET zwróci null dla niego)

...&something=+++&key2=value (parametr jest " ")

Dlaczego jest to preferowane Pproach:

  • Dobrze pasuje do jednej linii i jest jasne, co się dzieje.
  • To czytelny niż $value = isset($_GET['something']) ? $_GET['something'] : '';
  • mniejsze ryzyko kopiuj/wklej pomyłkę lub literówka: $value=isset($_GET['something'])?$_GET['somthing']:'';
  • Jest on kompatybilny ze starszymi i nowszymi php.

Aktualizacja tryb Strict może wymagać czegoś takiego:

$str_value = strval(@$_GET['something']); 
$trimmed_value = trim(@$_GET['something']); 
$int_value = intval(@$_GET['somenumber']);