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; ?>
Možná použít místo or and? Ale nejsem si jistý,zda je to správně?
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
Jasně,rozumím,chápu,Díky moc!
anonymníí
Profil *
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
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
V tomto případě je operátor and použit správně, ale začátečník to zkopíruje a náhodou zamění and za && a bude se divit, proč to nefunguje.
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
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)
tak v tu chvíli se zase && chová divně a "and" intuitivně.
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 &&.

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: