Operátory logického porovnání PHP. PHP: Logické operátory - Manuál. Logické konstrukce AND OR a NOT v podmíněném operátoru

>> Přečetl jsem několik těchto odpovědí a upřímně řečeno jsem nenašel žádnou, která by vysvětlovala rozdíly mezi operátory "||" a "OR".

Rozdíl je vysvětlen v odkazu na prioritu operátora.

"||" operátory jsou vyhodnoceny před přiřazením ("="), zatímco operátory "or" jsou vyhodnoceny po přiřazení. Ve vašem druhém příkladu říkáte PHP, aby nejprve přiřadilo výsledek "(choice1 != false ? "hah" : "boo")" $val a poté "nebo" ke zbytku příkazu. Vyzkoušejte níže uvedený příklad a uvidíte, co tím myslím (všimněte si dalších závorek, abyste vynutili prioritu):

definovat ("volba1" , false );
definovat ("volba2" , "pes" );
definovat ("výchozí1" , "jiné" );
$val = pole();

$val [ "Test 1" ] = (volba1 != nepravda ? "hah" : "boo" ) || (choice2 != false ? "hah2" : "boo2" ) || (default1 != false ? "hah3" : "boo3" );
$val [ "Test 1b" ] = ((choice1 != nepravda ? "hah" : "boo" ) || (choice2 != false ? "hah2" : "boo2" ) || (výchozí1 != false ? "hah3 " : "boo3" ));
$val [ "Test 2" ] = (choice1 != false ? "hah" : "boo" ) nebo (choice2 != false ? "hah2" : "boo2" ) nebo (výchozí1 != false ? "hah3" : " boo3");
$val [ "Test 2b" ] = ((choice1 != false ? "hah" : "boo" ) nebo (choice2 != false ? "hah2" : "boo2" ) nebo (výchozí1 != false ? "hah3" : "boo3" ));

Foreach ($val jako $test => $result ) (
print("$test: "); var_dump ($vysledek); tisknout"
\n
\n" ;
}
?>

test na hto dot com

Protože zkratka OR pro blok if může produkovat více
čitelný kód s méně psaním, je lákavé vytvářet funkce, které při selhání vrátí FALSE nebo při úspěchu nějaký jiný datový typ. Jako mysql_connect, který "Vrátí identifikátor odkazu MySQL při úspěchu nebo FALSE při selhání."

Začínající vývojář php php by se měl vyvarovat vytváření funkcí, které by mohly způsobit FALSE při selhání a celé číslo při úspěchu, pokud existuje nějaká šance, že celé číslo může být nula.

bla bla bla ;
$i = give_me_liberty () or die("FATAL DB ERROR!" );
bla bla bla ;
?>

ironmo67 na yahoo dot com

Objevil poněkud nepříjemný rozdíl mezi PHP a Perlem:


if (! some_function ()) return false ;
?>

nelze přepsat jako hezčí:

funkce nějaká_funkce ()( return false ; )
some_function () nebo return false ;
?>

Následující však bude fungovat:

funkce nějaká_funkce ()( return false ; )
some_function() or die();
?>

Uhodnete proč? Jednoduše, die() je funkce a "return" je příkaz (jako rozdíl mezi print() a echo). To je opravdu špatné, protože verzi if(!)() považuji za unavenou a nečitelnou, ale hej, je to lepší než if (some_c_function == 0) ( něco udělejte).

Spoustě diskuzí níže se dalo předejít jednoduše tím, že bylo jasné, že &, | a ^ nejsou *ne* logické operátory. To je důvod, proč nejsou uvedeny na této stránce. Jsou to operátory, které působí na binární reprezentace čísel. Nepřijímají logické hodnoty (tj. „pravda“ nebo „nepravda“) jako argumenty, aniž by je nejprve převedly na čísla 1 a 0. Ani nevrací logické hodnoty , ale čísla Jistě, s těmito čísly můžete později zacházet, jako by to byly logické hodnoty (v takovém případě je 0 přetypována na „nepravda“ a cokoli jiného je přetypováno na „pravda“), ale to je důsledek. Pravidla pro casting typu PHP a nic společného s chováním operátorů.

Pokud chcete logické operace, použijte logické operátory; pokud chcete bitové operace, použijte bitové operátory ... použití jednoho pro druhé se zdá být dobrý způsob, jak věci ztížit.

kws_ zavináč hotpop dot com

"To, že můžeš, neznamená, že bys měl."

Také mám pocit, že obcházení zkratového hodnocení a spoléhání se na vedlejší účinky v podmíněných výrazech je špatný styl. Psaní kódu, který se dokumentuje pomocí jasných a přímočarých konstrukcí, mi připadá jako mnohem lepší praxe než používat spletitý a obtížně čitelný výraz a vysvětlovat jej komentáři (nebo ještě hůř, nedokumentovat to vůbec!) Zdrojový kód by skutečně měl být napsán spíše pro oči programátora než pro oči počítače.

Využití bitových operátorů v logickém kontextu by mohlo narušit očekávání čtenáře a může způsobit zmatek, protože bitové operátory implikují operandy bitového pole.

Také se domnívám, že za předpokladu, že vyhodnocení zkratu je nejlepší pro logické konstrukce, JE v rámci „práv kompilátoru“, protože když jsou logické operátory použity pro jejich zamýšlený účel, předpoklady, že zkrat dělá *JSOU* logické, a dělají (ještě jednou při správném použití) optimalizovat vyhodnocování logických výrazů.

Není mým záměrem přímo pálit nebo urážet každého jednotlivce, ale pouze odradit od používání špatného stylu a povzbudit nové (a dokonce i některé zkušené) programátory, aby psali jasný a podrobný kód a mysleli spíše na programátory než na počítače, které by se mohly nakonec pokusit rozluštit vaše výtvory.

Odpověď na braintreno:

Druhý příklad, který jste uvedl, je správný způsob, jak to udělat! Není to vůbec spletitá logika, je to to, co dělá váš kód čitelným, protože se nespoléhá na obskurní vedlejší účinky! Čte se mnohem snadněji než první díl a mnohem snadněji se udržuje.

Pokud chcete, aby funkce CheckThisOrOther() předávala informace pouze uživateli, měli byste být zbaveni své kódovací licence. Kdybych někdy měl udržovat některý z tvých scénářů, musel bych tě nenávidět.

To není myšleno tak plamenem, jak by to mohlo znít! Zdrojový kód není napsán pro počítače, aby je spouštěl, ale pro kodéry, aby je četli! Mějte to na srdci a vaši spolupracovníci vám za to poděkují!

braintrino

Příspěvek Shadedecho k vynucení vyhodnocení obou výrazů OR je ve skutečnosti přesně to, co by se mělo udělat pro potlačení optimalizace zkratu.

Existuje mnoho příležitostí, kdy nechcete, aby kompilátor zkratoval jakékoli vyhodnocení, zvláště když chcete provést situaci a/nebo. Vyhodnocení zkratu provede operaci NEBO, ale ne operaci AND/OR!!!

Pokud například chci, aby se ve formuláři dotazu uživatele zjistilo, zda uživatel neodpověděl na některou položku A/NEBO pokud uživatel duplikoval stejnou odpověď pro více než jednu položku, musím formulář odeslat zpět klientovi. informování o tom, co chci opravit.

Funkce SomeAnswersAreMissing()
{
...
echo "Jejda! Neodpověděl jsi na některé otázky.";
vrátit TRUE;
}

Funkce SomeAnswersAreDuplicated()
{
...
echo "Jejda! Na oba můžete odpovědět stejným způsobem.";
vrátit TRUE;
}

If (SomeAnswersAreMissing() || SomeAnswersAreDuplicated())
SendFormAgain();

Pokud to udělám, uživatel uvidí pouze upozornění na chybějící odpověď, ale ne upozornění na duplicitní odpověď, i když jsou obě pravdivé. Toto není pro uživatele informativní, protože bude muset formulář znovu odeslat dvakrát, než si uvědomí, co všechno udělal špatně, a zmařit ho. To není uživatelsky přívětivé.

If (SomeAnswersAreMissing() | SomeAnswersAreDuplicated())
SendFormAgain();

Poté jsou odeslány obě varovné zprávy současně a uživatel to může opravit v jednom opětovném odeslání.

Děkuji shadedecho, hledal jsem způsob, jak přepsat hloupou optimalizaci zkratu kompilátoru. Počítač nemůže jen předpokládat, že zkrat je nejlepší :(

BTW, samozřejmě můžete:

$you_made_a_mistake = false;

If(SomeAnswersAreMissing())

if (SomeAnswersAreDuplicated())
$you_made_a_mistake = pravda;

Pokud ($you_made_a_mistake)
SendFormAgain();

Ale to je spletitá logika!!!

poskok

Vážení nováčci,

(protože nevidím, že se takové nápady vkrádají do myslí zkušených programátorů...)

Prosím, nevěnujte pozornost příspěvku shadedecho ze 14. března 2003 04:02! Hodně se spoléhá na nejasné vedlejší efekty, což je nejen velmi špatná programovací praxe, ale také nedosahuje optimalizace, kterou si myslí.

Správný způsob, jak to udělat


echo $a;
}

Práce, kterou shadedecho chce, je (ačkoli příklad jako celek je poněkud nevhodný):

$a .= bla();
$a .= blah2();

If ($a) ( echo $a; )

Pokud si přečtete diskuzi, na kterou odkazuje, zjistíte, že opravdu chtěl získat všechny odlišné položky ze dvou různých db tabulek. I tam se mýlí. Správný způsob, jak toho dosáhnout, je zpracovat první tabulku a poté zpracovat druhou tabulku.
To je nejen mnohem čitelnější než řešení s "|", ale také není nejméně pomalejší.

shadedecho

Zdá se (po hodně frustrujícím, ale nakonec užitečném hledání a diskuzi na fórech, jako jsou tek-tips), že
|| a && jsou "zkratované", jak již bylo uvedeno, ALE | Operátory a & (dokumentované PHP jako bitové operátory) se chovají jako jejich nezkratované protějšky.

Funkce bla() (
echo "ahoj< br>";
návrat "z bla()< br>";
}

Funkce bla2() (
echo "svět\< br>";
návrat "z bla2()< br>";
}

If (($a .= bla()) || ($a .= bla2())) (
echo $a;
}

Výsledkem by byl následující výstup:

Ahoj
od bla()

Všimněte si, že "svět" nedostal echo"d a "from blah2()" nedostal concat"d do proměnné $a, protože první přiřazení k $a bylo úspěšné, takže "zkrat" spustí a booleovský test se ukončí, aniž by vyhodnotil zbytek.

OVŠEM, pokud nahradíte || jen s | v tomto příkazu "if" získáte výstup:

Ahoj
svět
od bla()
od bla2()

Eureka! všechny části booleovského testu jsou vyhodnoceny očekávaným způsobem zleva doprava a podle všech normálních pravidel priority, pokud vidím.

To dává naprostý smysl... Při použití bitových operátorů dochází k bitové úrovni operace na výsledku dvou nebitových operací (přiřazení). Pokud nebitová operace vrátí null (jinými slovy, přiřazovaná hodnota se ukáže jako null nebo 0), bitový operátor by se na ni navázal (nebo vhodněji by ji „viděl“) jako „0“, jinak by viděl nenulovou hodnotu (řetězec bitů s alespoň jednou "1").

Potom bitově | se provádí na dvou hodnotách, a pokud je některá nenulová (má v sobě bity "1"), pak výsledek bude mít tyto bity "1" (nenulové) a příkaz if bude interpretovat všechny nenulové bity. nulová hodnota jako pravdivá v booleovském testu. Podobně, pokud oba operandy k | byly null nebo 0, výsledkem by byla nulová hodnota, která by "if" byla interpretována jako nepravda.

Výše uvedený příkaz if dělá bitově | na (v tomto případě) dvou nenulových hodnotách (s "1" na bitové úrovni), takže | operace vrací nenulovou hodnotu, která je poté znovu interpretována příkazem if jako TRUE!

Takže v tomto speciálním případě, kdy se pokoušíte dát dohromady nezkratované booleovské testy, tyto operátory pracují na svých operandech na bitové úrovni, a protože to nejsou srovnávací operátory, ale matematické operátory, nemohou být krátké- obvody a výsledné chování je nezkratovaný "booleovský test".

Vím, musíte si myslet, že jsem blázen, když se snažím obejít takovou vestavěnou optimalizaci, ale ujišťuji vás, že to má velmi dobrý důvod, a pokud vás to zajímá, můžete se podívat na toto vlákno jako já je tam velmi dlouhý příspěvek, který vysvětluje, co jsem se snažil udělat:

Je to 9. příspěvek níže, kde najdete můj popis mého databázového dotazu, který jsem chtěl optimalizovat.

Což asi není to, co chceš.

To může pomoci těm, kteří chtějí, aby se jejich kód četl jako anglicky, a mohli by si myslet, že rozdíly v prioritách těchto operátorů jsou poměrně exotické: není tomu tak.

Pokud jde o mě, narazil jsem na tento problém, protože neexistuje žádný symbolický logický XOR (například žádné ^^), takže jsem musel použít XOR, a pak jsem si řekl, že na podobných místech bych měl použít AND a OR a pak můj kód se pokazil :)

Tak teď už musím
$a = ($b xor $c);

Jesse Thompson
bend.com

yohgaki na hotmail dot com

V PHP4 "and", "nebo", "&&", "||" -- všechny jsou "zkraty" jako v C/C++. V PHP3 si myslím, že to tak nebylo.

"Zkrat" znamená, že jazyk zastaví hodnocení výrazu, když jsou určeny podmínky. (Většina jazyků používá vyhodnocení zkratu pro logickou podmínku)

$a = pravda;
$b = nepravda;
if ($a || $b) (
}

Tento příkaz "if" vyhodnocuje pouze $a, protože $a je pravdivé a celá podmínka musí být pravdivá. (tj. pokud $b je funkce místo hodnoty, funkce nebude volána)

muerte ve společnosti web-ster dot com

Doufal jsem, že najdu operátor podobný funkcím ||= v perlu. Moje první myšlenka by byla:

$i = $i nebo "výchozí"

Ale nebo to tak nefunguje Pokud chcete svým proměnným přiřadit výchozí hodnotu, pouze pokud ještě nejsou přiřazeny, MŮŽETE však:

$i nebo $i = "výchozí"

První příklad NEFUNGUJE, protože operátor nebo není přetížitelný, jako je tomu v Perlu.

dante ve společnosti heartme dot com


Chtěl jsem udělat něco takového:

$choice1 = "";
$choice2 = "pes";
$default = "jiné";
$val = $volba1 || $choice2 || $default;

Ale pak $val1 bude obsahovat pouze 1 nebo 0. Místo toho jsem udělal toto:

$choice1 = "";
$choice2 = "pes";
$default = "jiné";
$val = $volba1 nebo $volba2 nebo $výchozí;

Nyní $val obsahoval řetězec "pes". To je
divné, že "nebo" se liší od "||"...a chtěl bych
myslím, že "||" by měl být dostatečně chytrý, aby to zvládl
struny...tak, jak to dělá PERL. Asi ne. Možná je
výběr designu.


Hlavní věcí v akci tohoto operátora je podmínka. přeloženo z angličtiny znamená Li. Podmínka je přijata jako argument (co je v závorce). Podmínkou může být logický výraz nebo logická proměnná. Jednoduše řečeno, význam výrazu bude následující:

Pokud (podmínka)(
podmínka je splněna, udělejte to
}
jiný
{
podmínka není splněna, udělejte to jinak
}
Doufám, že logika podmíněné operace je jasná. Nyní se podívejme na příklad.

$a = 5;
$b = 25;

// Teď pozor! Podmínka: Pokud je $b větší než $a
// Znamení > a< , как и в математике, обозначают больше и меньше
if($b > $a)
{
// pokud je podmínka splněna, proveďte tuto akci
echo "$b je větší než $a";
}
jiný
{
// pokud se nespustí, tak toto
echo "$a je větší nebo rovno $b";
}
?>
Demonstrace Stáhněte si zdroje
Výsledkem je výstup skriptu 25 více než 5. Příklad je docela jednoduchý. Doufám, že je vše jasné. Nyní navrhuji zvážit složitější situaci, kdy musí být splněno několik podmínek. Každá nová podmínka bude obsahovat po hlavní podmínce li()- pomocný, který se píše jako jinak když(). Nakonec to bude jako obvykle jiný.

Úkol: Testování probíhá ve škole. Skripta musí vypočítat skóre, znát podmínky pro získání každé známky a samotné skóre studenta. Pojďme se podívat, jak to napsat, a nezapomeňte si přečíst komentář.

$test = 82; // dejme tomu, že student napsal test s 82 body

// napište první podmínku pro pětku
if($test > 90)
{
// pokud je podmínka splněna, proveďte tuto akci.
echo "Hodnocení 5";
}
// Znak && znamená "and, union", že podmínka je splněna, pokud jsou obě pravdivé
// to znamená, že skóre je menší než 91 a více než 80, pak 4. Jinak se podmínky čtou dále
jinak if ($test< 91 && $test > 80)
{
echo "Hodnocení 4";
}
jinak if ($test< 81 && $test > 70)
{
echo "Hodnocení 3";
}
jiný
{
echo "Měli bychom napsat test znovu...";
}
?>
Demonstrace Stáhněte si zdroje
Dostává náš student, který má čas jak na odpočinek, tak na psaní normálního testu hodnocení 4! Doufám, že princip fungování je jasný.

Je také možné krátce zaznamenat operaci podmíněné operace, kdy potřebujete akci pouze při splnění podmínky.

$věk = 19; // proměnné s věkem

If ($věk > 17)(
echo "To je ono! Můžu si dělat co chci! Už mám $věk!";
}
Docela pěkný příklad krátkého zápisu podmíněné operace. jiný není nutné psát.

Porovnání operátorů v PHP

Princip fungování podmíněné operace je jasný. Ale jak jste pochopili, existuje mnohem více způsobů srovnání. Podívejme se na níže uvedenou tabulku se srovnávacími operátory.

Příklad Název Výsledek
$a == $b Rovná se True, pokud $a se rovná $b
$a === $b Totožné s True, pokud $a je rovno $b a obě proměnné jsou stejného typu
$a != $b Nerovná se True, pokud $a není rovno $b
$a === $b Není totožné s True, pokud $a není rovno $b a oba typy nejsou stejné
$a > $b Větší než True, pokud $a je větší než $b
$a< $b Меньше чем True, если $a меньше, чем $b
$a >= $b Větší nebo rovno True, pokud $a je větší nebo rovno $b
$a<= $b Меньше или равно True, если $a меньше или равно $b
Nyní se podíváme na operátory s příklady:

// v rozporu se zvykem = znamená přiřazení hodnoty proměnné a == se rovná
if ($a == 5)(
echo "$a je 5"; // vypíše "5 se rovná 5"
) jinak (
echo "$a se nerovná 5";
}

Pokud ($a != 6)(
echo "$a se nerovná 6"; // vypíše "5 se nerovná 6". Nezbytné v případě zamítnutí
) jinak (
echo "$a se nějak rovná 6";
}

// s více a méně si myslím, že je vše jasné. Proto je příklad složitější
pokud ($a<= 6){
echo "$a je menší nebo rovno 6"; // vypíše "5 je menší nebo rovno 6"
) jinak (
echo "$a je větší než 6";
}

PHP logické operátory

Jsou chvíle, kdy potřebujete porovnat ne jednu proměnnou, ale dvě nebo více najednou v jedné podmínce. Pro toto existují logické operátory.

Příklad Název Výsledek
$a a $b Logické "a" PRAVDA, pokud $a i $b jsou PRAVDA.
$a nebo $b Logické "nebo" PRAVDA, pokud $a nebo $b je PRAVDA.
$a xor $b Výhradní "nebo" PRAVDA, pokud $a nebo $b je PRAVDA, ale ne obojí.
! $a Negace TRUE, pokud $a není TRUE.
$a && $b Logické "a" PRAVDA, pokud $a i $b jsou PRAVDA.
$a || $b Booleovské "nebo" PRAVDA, pokud $a nebo $b je PRAVDA.
Už jsme si toho všimli u operací A A nebo existují další operátoři? To se provádí za účelem upřednostnění složitých srovnávacích operací. V tabulce jsou logické operátory seřazeny podle priority: od nejmenšího po největší, tedy například || má vyšší prioritu než nebo.

Jdeme dál k příkladům

$a = 5;
$b = 6;
$c = 7;

// podmínka: Pokud 5 není rovno 6 (PRAVDA) A 6 se nerovná 7 (PRAVDA)
pokud ($a< 6 && $b != $c){
echo "Vskutku ano!"; // vypíše "Vskutku ano!" protože OBĚ podmínky jsou PRAVDIVÉ
) jinak (
echo "Jedna z podmínek není pravdivá";
}

// podmínka: Pokud 6 není rovno 6 (NEPRAVDA) NEBO 6 není rovno 7 (PRAVDA)
if ($b != 6 || $b != $c)(
echo "To je ono!"; // zobrazí "To je ono!", protože alespoň JEDNA z podmínek je PRAVDA
) jinak (
echo "Obě podmínky jsou nepravdivé";
}

Ternární operátor

Navrhuji, abyste se k otázce ternárního kódu vrátili později. Nemohl jsem to nezmínit, protože je to důležitý návrh, který výrazně snižuje velikost kódu. Navrhuji, abyste se hned podívali na kód.

Podstata kódu:(podmínka)? hodnota a je-li pravdivá: hodnota a je-li nepravda

Zkrátíme tedy příkaz if. Tato operace je však platná pouze při přiřazování hodnot k proměnné. Nyní se podívejme na hotový příklad.

// Příklad použití ternárního operátoru
$settings = (prázdné($_POST["nastavení"])) ? "Výchozí" : $_POST["nastavení"];

// Výše ​​uvedený kód je podobný následujícímu bloku pomocí if/else
if (prázdné($_POST["nastavení"])) (
$settings = "Výchozí"; // Pokud se nic nepřenese, ponechte to jako "Výchozí"
) jinak (
$nastavení = $_POST["nastavení"]; // Je-li předáno, pak $settings je přiřazena předaná hodnota.
}
?>
Přečtěte si komentáře ke kódu a vše by mělo být jasné.

Děkuji za pozornost!


PHP podporuje standardní logické operátory AND a && , OR a || , ! (ne) a XOR . Logické operátory umožňují porovnat výsledky dvou operandů (hodnoty nebo výrazu), abyste určili, zda jeden nebo oba vrátí hodnotu true nebo false, a podle vrácené hodnoty zvolit, zda chcete pokračovat ve provádění skriptu. Stejně jako porovnávací operátory vrací logické operátory jednu booleovskou hodnotu – true nebo false, v závislosti na hodnotách na obou stranách operátoru.

Logické OR (OR a ||)

Logický operátor OR se označuje jako OR nebo || . Provádí logickou operaci OR na dvou operandech. Pokud je jeden nebo oba operandy pravdivé, vrátí hodnotu true. Pokud jsou oba operandy nepravdivé, vrátí hodnotu false. Asi máte otázku: proč udělali dvě verze jednoho operátora? Smyslem dvou různých variant logického operátoru OR je, že pracují s různými prioritami.

Nejprve se podívejme, jak funguje operátor ||. . Pokud je tedy jeden nebo oba jeho operandy pravdivé, vrátí true . Pokud oba operandy vrátí false hodnoty, vrátí false .

Operátor OR funguje stejně jako operátor | s jednou výjimkou, pokud je s přiřazením použit operátor OR, nejprve vyhodnotí a vrátí hodnotu levého operandu, jinak funguje úplně stejně jako operátor || , tj. pokud jsou jeden nebo oba jeho operandy pravdivé, vrátí true . Pokud oba operandy vrátí hodnotu false, vrátí hodnotu false .

Aby bylo jasnější, jak fungují, uveďme následující příklad:

1 // Nejprve je proměnné přiřazena hodnota false a poté je vyhodnocen druhý operand // Prioritní akce: ($var2 = false) nebo true $var2 = false nebo true;
echo $var2; // false se nevytiskne // ($var3 = 0) nebo 3 $var3 = 0 nebo 3;

echo"

$var3"; // => 0 ?>

Jakékoli srovnávací a logické operátory lze kombinovat do složitějších struktur:

Pokud jde o operátory OR i ||, stojí za zmínku ještě jeden důležitý bod. . Logický operátor OR zahájí své vyhodnocení svým levým operandem, pokud vrátí hodnotu true, pak pravý operand nebude vyhodnocen. To šetří čas provádění, ale je třeba dbát na to, aby kód, na kterém může záviset správná činnost programu, nebyl umístěn do operandu vpravo.

Logické AND (AND a &&)

Operátor AND funguje stejně jako operátor && s jednou výjimkou, pokud je operátor AND použit s přiřazením, nejprve vyhodnotí a vrátí hodnotu levého operandu, jinak funguje úplně stejně jako operátor &&. Pokud alespoň jeden z jeho operandů vrátí hodnotu false, vrátí také hodnotu false, a pokud oba operandy vrátí hodnotu false, vrátí hodnotu false.

Pro pochopení se nyní podívejme, jak to funguje v praxi:

$bar3"; // => 9 ?>

Exkluzivní OR (XOR)

Exkluzivní operátor OR je označen jako XOR. Vrací hodnotu true, pokud je pravdivý pouze jeden z jejích operandů. Pokud jsou oba operandy pravdivé, operátor vrátí hodnotu false.

Protože operátor XOR má stejnou prioritu jako operátory AND a OR (nižší než operátor přiřazení) a používá se ve výrazu přiřazení, nejprve vyhodnotí a vrátí hodnotu levého operandu.

6 $a1 = 19 x nebo 5 > 6;< 3) xor (5 != 5)); // true ?>

var_dump($a1); // => 19 var_dump(true xor true); // false var_dump((2

Logické NE (!)

Logický operátor NOT, nazývaný také negace, je označen znaménkem! . Je to unární operátor umístěný před jedním operandem. Logický operátor NOT se používá k invertování logické hodnoty svého operandu a vždy vrací hodnotu true nebo false .

Pokud potřebujete převrátit hodnotu výrazu, jako je a && b , budete muset použít závorky: !(a && b) . Také s pomocí operátora! Libovolnou hodnotu x můžete převést na její booleovský ekvivalent pomocí operátoru: !!x dvakrát. logické operátory PHP podporuje následující standard

: "AND" a "&&" (logické AND), "OR" a "||"

(logické NEBO), "!"

Je důležité pochopit, jak interpret zpracovává booleovské výrazy. Pokud ve výrazu s operátorem "||"

první (levý) operand bude mít hodnotu true nebo ve výrazu s operátorem "&&" bude mít první operand hodnotu false , pak se druhý (pravý) operand již nebude počítat. Je to dáno tím, že konečný výsledek se v takových případech nezmění (viz tabulka č. 1), a proto není potřeba ztrácet čas zpracováním kódu druhého operandu. Musíte však dávat pozor, abyste neumístili kód do správného operandu, na kterém může záviset správná činnost programu.

Použití logických operátorů ukazuje příklad č. 2.

false $a=0||false; //Nyní $a==pravda, protože 5->pravda a 8->pravda $a=5& //Nyní $a==nepravda, protože "0"->false $a="0"& //Nyní $a==pravda $a=!false; //Nyní $a==false, protože 5->pravda $a=!5; /* Funkce foo() nebude volána kvůli shuntům */ $a=(false&&foo()); $b=(true||foo()); $c=(false a foo()); $d=(true nebo foo()); /* Rozdíl "||" od "nebo" a "&&" od "and" */ //Chová se jako ($a=(false||true)) $a=false||true; //Funguje jako (($a=false) nebo true) $a=false nebo true; //Chová se jako ($a=(false&&true)) $a=false& //Chová se jako (($a=false) a pravda) $a=false a pravda; //Nyní $a==5 se chová jako (($a=5) xor 0) $a=5 xor 0; //Nyní $a==5 se chová jako (($a=5) a 0) $a=5 a 0; //Nyní $a==5 se chová jako (($a=5) nebo 0) $a=5 nebo 0; //Nyní $a==pravda, chová se jako ($a=(5||0)) $a=5||0; //Nyní $a==false, chová se jako ($a=(5&&0)) $a=5& //Nyní $a==pravda, chová se jako ($a=(5 xor 6)) $a=(5 xor 6); ?>

Příklad č. 2.

Použití logických operátorů

Poslední aktualizace: 1.11.2015

    V PHP můžeme používat různé operátory: aritmetické, logické atd. Podívejme se na jednotlivé typy operací.

    Aritmetické operace

    + (operace přidání)

    Například $a + 5

    - (operace odečítání)

    Například $a - 5

    * (násobení)

    Například $a * 5

    / (divize)

    Například $a / 5

    % (získání zbytku dělení)

    Například: $a=12; echo $a % 5; // rovná se 2

    ++ (zvýšení/zvýšení hodnoty o jednu)

    Například ++$a

    Je důležité pochopit rozdíl mezi výrazy ++$a a $a++ . Například:

    -- (snížit/snížit hodnotu o jednu)

    Například --$a . A také, stejně jako v případě přírůstku, existují dva typy záznamu: --$a a $a--

Operátoři přiřazení

    Přirovná proměnnou ke konkrétní hodnotě: $a = 5

    Sčítání následované přiřazením výsledku. Například: $a=12; $a += 5; echo $a; // rovno 17

    Odečítání následované přiřazením výsledku. Například: $a=12; $a -= 5; echo $a; // rovná se 7

    Násobení následované přiřazením výsledku: $a=12; $a *= 5; echo $a; // rovná se 60

    Dělení následované přiřazením výsledku: $a=12; $a /= 5; echo $a; // rovno 2,4

    Spojte řádky a přiřaďte výsledek. Platí pro dva řádky. Pokud proměnné neukládají řetězce, ale například čísla, pak se jejich hodnoty převedou na řetězce a poté se provede operace: $a=12; $a .= 5; echo $a; // rovno 125 // shodné s $b="12"; $b .="5"; // rovná se 125

    Získání zbytku dělení a následné přiřazení výsledku: $a=12; $a %= 5; echo $a; // rovná se 2

Srovnávací operace

Porovnávací operace se obvykle používají v podmíněných konstrukcích, když je nutné porovnat dvě hodnoty a v závislosti na výsledku srovnání provést určité akce. K dispozici jsou následující srovnávací operace.

    Operátor rovnosti porovná dvě hodnoty, a pokud jsou stejné, vrátí hodnotu true, jinak vrátí hodnotu false: $a == 5

    Operátor identity také porovná dvě hodnoty, a pokud jsou stejné, vrátí true, jinak vrátí false: $a === 5

    Porovná dvě hodnoty, a pokud nejsou stejné, vrátí true, jinak vrátí false: $a != 5

    Porovná dvě hodnoty, a pokud nejsou stejné, vrátí true, jinak vrátí false: $a !== 5

    Porovná dvě hodnoty, a pokud je první větší než druhá, vrátí true, jinak vrátí false: $a > 5

    Porovná dvě hodnoty, a pokud je první menší než druhá, vrátí true, jinak vrátí false: $a< 5

    Porovná dvě hodnoty, a pokud je první větší nebo rovna druhé, vrátí hodnotu true, jinak vrátí hodnotu false: $a >= 5

    Porovná dvě hodnoty, a pokud je první menší nebo rovna druhé, vrátí hodnotu true, jinak vrátí hodnotu false: $a<= 5

Operátor rovnosti a identity

Oba operátory porovnávají dva výrazy a vrátí hodnotu true, pokud jsou výrazy stejné. Ale jsou mezi nimi rozdíly. Pokud operace rovnosti nabývá dvou hodnot různých typů, pak jsou redukovány na jednu - tu, kterou interpret považuje za optimální. Například:

Je zřejmé, že proměnné ukládají různé hodnoty různých typů. Při porovnání se ale zredukují na stejný typ – číselný. A proměnná $a se zredukuje na číslo 22. A nakonec se obě proměnné budou rovnat.

Nebo se například rovnají také následující proměnné:

$a = nepravda; $b = 0;

Aby se předešlo takovým situacím, používá se operace ekvivalence, která bere v úvahu nejen hodnotu, ale také typ proměnné:

$a = "22a"; $b = 22; if($a===$b) echo "rovná se"; else echo "není rovno";

Nyní se proměnné nebudou rovnat.

Operátory nerovnosti != a !== fungují podobně.

Logické operace

Logické operace se obvykle používají ke spojení výsledků dvou porovnávacích operací. Například potřebujeme provést určitou akci, pokud je splněno několik podmínek. K dispozici jsou následující logické operace:

    Vrátí hodnotu true, pokud obě operace porovnání vrátí hodnotu true, jinak vrátí hodnotu false: $a == 5 && $b = 6

    Podobně jako u operace &&: $a == 5 a $b > 6

    Vrátí hodnotu true, pokud alespoň jedna operace porovnání vrátí hodnotu true, jinak vrátí hodnotu false: $a == 5 || $b = 6

    Podobně jako u operace || : $a< 5 or $b > 6

    Vrátí hodnotu true, pokud operace porovnání vrátí hodnotu false: !($a >= 5)

    Vrátí hodnotu true, pokud je pravdivá pouze jedna z hodnot. Pokud jsou pravdivé obě nebo ani jedna, vrátí hodnotu false. Například: $a=12; $b=6; if($a xor $b) echo "true"; else echo "false";

    Zde bude výsledek logické operace nepravdivý, protože obě proměnné mají specifickou hodnotu. Pojďme změnit kód:

    $a=12; $b=NULL; if($a xor $b) echo "true"; else echo "false";

    Zde již bude výsledek pravdivý, protože hodnota jedné proměnné není nastavena. Pokud má proměnná hodnotu NULL, pak v logických operacích bude její hodnota považována za nepravdivou

Bitové operace

Bitové operace se provádějí na jednotlivých bitech čísla. Čísla jsou uvažována v binární reprezentaci, například 2 v binární reprezentaci je 010, číslo 7 je 111.

    & (logické násobení)

    Násobení se provádí bitově, a pokud mají oba operandy bitové hodnoty rovné 1, operace vrátí 1, jinak se vrátí číslo 0 Například: $a1 = 4; //100 $b1 = 5; //101 echo $a1 & $b1; // rovná se 4

    Zde se číslo 4 v binární soustavě rovná 100 a číslo 5 se rovná 101. Vynásobte čísla bitově a dostanete (1*1, 0*0, 0 *1) = 100, tedy číslo 4 v desítkovém formátu.

    | (logický dodatek)

    Podobně jako u logického násobení se operace také provádí s binárními číslicemi, ale nyní je vrácena jednička, pokud má alespoň jedno číslo v dané číslici jedničku. Například: $a1 = 4; //100 $b1 = 5; //101 echo $a1 | $b1; // rovná se 5

    ~ (logická negace)

    invertuje všechny bity: pokud je hodnota bitu 1, stane se nulou a naopak.

    $b = 5; echo ~$b;<

    x

x>>y - posune číslo x doprava o y číslic. Například 16>>1 posune číslo 16 (což je 10 000 v binárním systému) o jedno místo doprava, takže výsledek je 1 000 nebo číslo 8 v desítkové soustavě

Zřetězení řetězců

Operátor tečka se používá ke zřetězení řetězců. Propojme například několik řádků:

$a="Dobrý den,"; $b="svět"; echo $a . $b. "!";




Nahoru