Autor Zpráva
Jcas
Profil *
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; 
by mělo být:
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
Jcas:
function test1($first, $second) {
    echo ($first!=$second) ? false : true; 
   return ($first!=$second) ? false : true;
    }

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: