| 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/falseTerná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ěžujeDá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: 12 let
|
|||
0