Autor | Zpráva | ||
---|---|---|---|
snazimse Profil |
Zdravím,
mám dotaz na phpčkaře,co s tím. Nefunguje mi správně podmínky první if je znegovaný ,ale vůbec tak nefunguje,je to celé nějaké divné,když dam vykříčník pryč tak vše funguje jak má,ale takhle vůbec,jestli funkce není,první podmínka. Funkce tam je a funguje to naopak.A druhá podmínka vůbec,jak je to možné? Co mám špatně? Potřebuji aby první podmínka byla znegována a druhá ne. Díky všem <?php function have_posts() { echo "hello"; } $neco= 15; if ((!have_posts()) or ($neco == 16)) : ?> <h1>Vypsáno podle podmínky</h1><div id="neco">........</div> <?php endif; ?> |
||
juriad Profil |
Ta funkce have_posts nic explicitně nevrací; návratová hodnota je tedy implicitní - NULL.
V podmínce se NULL vyhodnocuje jako FALSE, tedy po znegování je to TRUE. Tedy první část podmínky je vždy splněná a tu druhou část (ta rovnost šestnácti) se PHP ani nebude pokoušet vyhodnotit. Nepoužívej operátory and, or, xor v této podobě, slouží k něčemu jinému (http://cz1.php.net/language.operators.logical). Používej v tomto případě &&, ||. Nevím, čeho chceš dosáhnout, ale snad ti to, co jsem napsal, pomůže. |
||
snazimse Profil |
#3 · Zasláno: 18. 5. 2014, 19:10:54
Jasně,rozumím,chápu,Díky moc!
|
||
anonymníí Profil * |
#4 · Zasláno: 19. 5. 2014, 11:44:37
juriad:
„Nepoužívej operátory and, or, xor v této podobě, slouží k něčemu jinému“ K čemu, prosím? Podle mého slouží k témuž, jen s trochu jinou prioritou. Pokud ne, oprav mě, prosím. Toto není šťourání, jen dotaz, který mě skutečně zajímá. I z tebou odkázané stránky: $a and $b -TRUE if both $a and $b are TRUE. $a && $b - TRUE if both $a and $b are TRUE. |
||
AM_ Profil |
#5 · Zasláno: 19. 5. 2014, 11:59:33
rozdíl mezi and a &&, or a || je pouze v prioritě operátorů, a to pouze vůči operátoru přiřazení. v if je tedy úplně jedno, co použiješ.
|
||
juriad Profil |
anonymníí, AM:
A rozdíl je i vůči prioritě ternárního výrazu. $a and $b ? 1 : 0 $a && $b ? 1 : 0 Priorita and, or a xor je neobvyklá a neintuitivní. Ve většině případů to projde, ale zkus nějaký výraz napsat s těmito operátory bez hlubšího promyšlení. Tyto operátory nejsou široce používané a na první pohled vypadají ekvivalentně, čímž může být začátečník zmaten. V C a C++ existují operátory slovem zapsané logické operátory, ale mají stejnou prioritu; nejspíš to bude podobně i v některých dalších jazycích. Situace v PHP nejspíše vznikla z Perlu, což je šílenost sama. while ($row = mysql_fetch_row($result) and !$finished) # nebo if, to je jedno Ve spoustě učebnic je zmíněna konstrukce ... or die('Chyba!') , ale to je přílišné zjednodušení, které nabádá ke špatným návykům a neospravedlňuje existenci operátoru or.
Doporučuji tedy (z vlastní zkušenosti) operátory and, or, xor vůbec nepoužívat a jen vědět, že existují a že se liší prioritou. |
||
AM_ Profil |
#7 · Zasláno: 19. 5. 2014, 14:21:52
Jasně, pokud píšeš přiřazení v podmínce, tak na tom záleží, ale když si nejsem jist prioritou operátorů, raději se podívám nebo tam dám závorky. Co když budu chtít např. toto:
if ($this_if_was_successful = $finished && $valid) Moje rada tedy zní divoké operátorové konstrukce buď nepoužívat vůbec, nebo závorkovat (nebo se podívat do dokumentace na prioritu, ale závorkování je pro budoucí čtenáře kódu zřejmější). Ostatně, NetBeans při kontrole best practices důrazně varují, když v podmínce přiřazujete :) občas je to výhodné pro stručnost, pokud se bavíme o čitelnosti kódu, je lepší to nedělat. Pokud píšete čistý a čitelný kód bez akrobatických podmínek, je opravdu jedno, zda použijete and, nebo &&. |
||
Časová prodleva: 10 let
|
0