Autor | Zpráva | ||
---|---|---|---|
Jcas Profil * |
#1 · Zasláno: 8. 5. 2014, 18:08:29
Nedávno (ještě živé vlákno) jsem pronesl, že jako laik "mám stále největší problémy v syntaxi v praktickém použití." "Co si můžu někde dovolit a jinde ne".
Také jsem pronesl "Jaké bylo překvapení, že ternární operátor nelze použít v echo." Tohle bylo špatné tvrzení a hned mi bylo vyvráceno. Ona totiž ta skutečnost, kterou jsem kdysi zjistil byla jinak. "echo nelze použít v ternárním operátoru." Také jsme řešili return z funkce, tak jsem si to přidal do testu. Výsledek je níže.
Nyní zakládám toto vlákno, aby ostatní začátečníci zbytečně neopakovali moje chyby. function test1($first, $second) { $first!=$second ? echo false : echo true; //Parse error: syntax error, unexpected T_ECHO $first!=$second ? return false : return true; //Parse error: syntax error, unexpected T_RETURN in } function test2($first, $second) { $vysledek = $first!=$second ? false : true; echo $vysledek; // vypíše 1 při true, nebo nic při false return $vysledek; } function test3($first, $second) { if($first!=$second) { echo false;} else { echo true;} // vypíše 1 při true, nebo nic při false if($first!=$second) { echo 'false';} else { echo 'true';} // vypíše true, nebo false if($first!=$second) { return false;} else { return true;} } function test4($first, $second) { echo $first!=$second ? false : true; // vypíše 1 při true, nebo nic při false echo $first!=$second ? 'false' : 'true'; // vypíše true, nebo false return $first!=$second ? false : true; } var_dump(test2(1, 1)); echo '<br>'; // bool(true) var_dump(test2(1, 2)); echo '<br>'; // bool(false) var_dump(test3(1, 1)); echo '<br>'; // bool(true) var_dump(test3(1, 2)); echo '<br>'; // bool(false) var_dump(test4(1, 1)); echo '<br>'; // bool(true) var_dump(test4(1, 2)); echo '<br>'; // bool(false) Funkce1 skončí fatální chybou, a to i v případě echo, a tak i v případě return. Takže to je naprosto nesprávné použití ternárního operátoru. Je to trochu překvapení a když se vrátím k první větě - "mám stále největší problémy v syntaxi v praktickém použití." "Co si můžu někde dovolit a jinde ne", tak přesně to se odehrálo. Člověk by si řekl: if(podmínka) {proveď příkaz;} else {proved příkaz;} (podmínka) ? proved příkaz : proved příkaz; Tak tohle je naprosto špatně. Evidentně ternární operátor neumí provádět příkazy, ale pouze vrací nějakou hodnotu na základě splnění či nesplnění podmínky. Vsadím se, že tuto větu bych našel někde v manuálu, či ve článku. Ale opět se vrátím k mému prvotnímu tvrzení "praktické použití". Když člověk bude studovat článek, manuál, tak se mu může lehce stát, že opomene nějakou důležitou větu, která mu to časem vrátí i s pohlavkem. Ale zpět k testu. Funkce 2 a 4 je správné použití ternárního operátoru. To že je to správně platí až tehdy, až to potvrdí zkušený programátor!!!!! Funkce 3 je obyč if() a bylo to pouze součástí testu. Nevztahuje se na ternární operátor. Poznatky 1. Pokud var_dump() volá funkci, která nic nevrací, tedy nemá return vypisuje NULL .
2. echo zpracuje true tak, že vypíše 1 . Zato při false nevypíše nic.
|
||
juriad Profil |
Ano. V PHP a obecně v programovacích jazycích se rozlišuje:
příkaz a výraz. Výraz (expression) je věc, kterou můžeš někam přiřadit, má hodnotu. Příkaz (statement) je buď výraz nebo použití některého konstruktu jazyka, je vždy zakončený středníkem. Za příkaz se bere i konstrukt typu if, for, function (tedy něco za čím následuje blok příkazů). $a + $b #je výraz $a + $b; #je příkaz (byť zbytečný, protože nic neudělá) echo $a + $b; #je příkaz $a = $b #je kupodivu výraz; lze totiž napsat if ($a = $b) {...} a má to význam: přiřaď $b do $a, a pak zjisti, zda $a je true $a = $b; #je příkaz $a == $b #je výraz s hodnotou true/false Ternární operátor vyžaduje tři výrazy a sám je výrazem: (podmíněný výraz) ? (výraz při splnění) : (výraz při nesplnění) $a < $b ? $a : $b #výraz vracející minimum echo $a == 0 ? 'Neumím dělit nulou :(' : 1 / $a; #příkaz, který vypíše převrácenou hodnotu čísla, nebo si postěžuje Dávej tedy pozor v dokumentaci na slova expression a statement. Viz třeba if. Ano, použití ternárního výrazu v testu 2 a testu 4 je v pořádku. Tedy tvé: if(podmínka) {proveď příkaz;} else {proved příkaz;} (podmínka) ? proved příkaz : proved příkaz; if(podmínka) {proveď příkaz} else {proveď příkaz} # bez těch středníků, přikaz už středník obsahuje, nebo je to nějaký „blokový příkaz“ typu if. ... podmínka ? proveď výraz : proveď výraz ... # výrazy a ten středník na konci být nemá |
||
weroro Profil |
#3 · Zasláno: 9. 5. 2014, 00:31:41
Jcas:
function test1($first, $second) { echo ($first!=$second) ? false : true; return ($first!=$second) ? false : true; } |
||
Časová prodleva: 10 let
|
0