Nosacīti paziņojumi. Loģiskie operatori PHP Loģiskās darbības stāvoklī

PHP atbalsta standarta loģiskos operatorus AND un && , OR un || , ! (nav) un XOR . Loģiskie operatori ļauj salīdzināt divu operandu (vērtības vai izteiksmes) rezultātus, lai noteiktu, vai viens vai abi atgriež patieso vai nepatieso vērtību, un izvēlēties, vai attiecīgi turpināt skripta izpildi, pamatojoties uz atgriezto vērtību. Tāpat kā salīdzināšanas operatori, loģiskie operatori atgriež vienu Būla vērtību - patiesu vai nepatiesu, atkarībā no vērtībām abās operatora pusēs.

Loģiskais VAI (VAI un ||)

Loģiskais operators VAI tiek apzīmēts kā VAI vai || . Tas veic loģisku VAI operāciju diviem operandiem. Ja viens vai abi operandi ir patiesi, tas atgriež patiesu. Ja abi operandi ir nepatiesi, tas atgriež false. Jums droši vien ir jautājums: kāpēc viņi izveidoja divas viena operatora versijas? Divu dažādu loģiskā VAI operatora variantu būtība ir tāda, ka tie darbojas ar dažādām prioritātēm.

Vispirms apskatīsim, kā darbojas || operators. . Tātad, ja viens vai abi operandi ir patiesi, tas atgriež patiesu . Ja abi operandi atgriež nepatiesas vērtības, tas atgriezīs false .

OR operators darbojas tāpat kā || operators. ar vienu izņēmumu, ja ar piešķiršanu tiek izmantots operators VAI, tas vispirms novērtēs un atgriezīs kreisā operanda vērtību, pretējā gadījumā tas darbojas tieši tāpat kā || operators. , t.i. ja viens vai abi operandi ir patiesi, tas atgriež patiesu . Ja abi operandi atgriež false, tas atgriezīs false .

Lai padarītu skaidrāku, kā tie darbojas, sniegsim šādu piemēru:

1 // Vispirms mainīgajam tiek piešķirta vērtība false, un pēc tam tiek novērtēts otrais operands // Prioritātes darbība: ($var2 = false) vai true $var2 = false vai true; atbalss $var2; // false netiek drukāts // ($var3 = 0) vai 3 $var3 = 0 vai 3; atbalss"
$var3"; // => 0 ?>

Jebkurus salīdzināšanas un loģiskos operatorus var apvienot sarežģītākās struktūrās:

Ir vēl viens svarīgs punkts, ko vērts pieminēt gan attiecībā uz TR, gan || operatoriem. . Loģiskais operators VAI novērtēšanu sāk ar kreiso operandu; ja tas atgriež patiesu, labais operands netiks novērtēts. Tas ietaupa izpildes laiku, taču ir jārūpējas, lai kods, no kura var būt atkarīga pareiza programmas darbība, netiktu ievietots labās puses operandā.

Loģiskais UN (UN un &&)

Loģiskais operators UN tiek apzīmēts kā UN vai && . Tas veic loģisku UN operāciju diviem operandiem. Tas atgriež patiesu tad un tikai tad, ja abi operandi novērtē uz patiesu. Ja viens vai abi operandi atgriež false, operators atgriež false. Operatora “loģiskā UN” divu atšķirīgo versiju nozīme ir tāda pati kā diviem iepriekšējiem operatoriem, proti, ka tie strādā ar dažādām prioritātēm.

Vispirms apskatīsim, kā darbojas && operators. Tātad, ja abi operandi ir patiesi, tas atgriež patiesu . Ja vismaz viens vai abi operandi atgriež false , tas arī atgriezīs false .

UN operators darbojas tāpat kā && operators ar vienu izņēmumu, ja operators UN tiek izmantots ar piešķiršanu, tas vispirms novērtēs un atgriezīs kreisā operanda vērtību, pretējā gadījumā tas darbojas tieši tāpat kā && operators. Ja vismaz viens no tā operandiem atgriež false, tas atgriezīs arī false, un, ja abi operandi atgriež false, tas atgriezīs false.

Lai saprastu, tagad apskatīsim, kā tas darbojas praksē:

$bar3"; // => 9 ?>

Ekskluzīvs VAI (XOR)

Ekskluzīvais VAI operators ir apzīmēts kā XOR. Tas atgriež patiesu, ja ir patiess tikai viens no tā operandiem. Ja abi operandi ir patiesi, operators atgriezīs false.

Tā kā operatoram XOR ir tāda pati prioritāte kā operatoriem UN un VAI (mazāk nekā piešķiršanas operatoram), un tas tiek izmantots piešķiršanas izteiksmē, tas vispirms novērtē un atgriež kreisā operanda vērtību.

6 $a1 = 19 x vai 5 > 6; var_dump($a1); // => 19 var_dump(true xor true); // false var_dump((2< 3) xor (5 != 5)); // true ?>

Loģiski NĒ (!)

Loģisko operatoru NOT, ko sauc arī par noliegumu, norāda zīme! . Tas ir unārs operators, kas novietots pirms viena operanda. Loģiskais operators NOT tiek izmantots, lai apgrieztu tā operanda loģisko vērtību, un vienmēr atgriež patiesu vai nepatiesu.

Ja jums ir jāapgriež izteiksmes vērtība, piemēram, a && b , jums būs jāizmanto iekavas: !(a && b) . Arī ar operatora palīdzību! Varat pārvērst jebkuru x vērtību tās Būla ekvivalentā, izmantojot operatoru: !!x divreiz.

Pēdējā atjaunināšana: 1.11.2015

PHP mēs varam izmantot dažādus operatorus: aritmētisko, loģisko utt. Apskatīsim katru darbības veidu.

Aritmētiskās darbības

    + (papildīšanas darbība)

    Piemēram, $ a + 5

    - (atņemšanas darbība)

    Piemēram, $a - 5

    * (reizināšana)

    Piemēram, $a * 5

    / (nodalījums)

    Piemēram, $a / 5

    % (iegūstot dalījuma atlikumu)

    Piemēram: $a=12; atbalss $a % 5; // vienāds ar 2

    ++ (palieliniet/palieliniet vērtību par vienu)

    Piemēram, ++$a

    Ir svarīgi saprast atšķirību starp izteicieniem ++$a un $a++ . Piemēram:

    $a=12; $b=++$a; // $b ir vienāds ar 13 echo $b;

    Šeit, pirmkārt, mainīgā $a vērtībai tiek pievienots viens, un pēc tam tā vērtība tiek pielīdzināta mainīgajam $b. Citādi būtu, ja izteiksme izskatītos šādi: $b=$a++; . Šeit vispirms mainīgā $a vērtība bija vienāda ar mainīgo $b, un pēc tam tika palielināta mainīgā $a vērtība.

    -- (samazināt/samazināt vērtību par vienu)

    Piemēram, --$a . Un arī, tāpat kā pieauguma gadījumā, ir divi ierakstīšanas veidi: --$a un $a--

Piešķiršanas operatori

    Pielīdzina mainīgo noteiktai vērtībai: $a = 5

    Papildināšana, kam seko rezultāta piešķiršana. Piemēram: $a=12; $a += 5; atbalss $a; // vienāds ar 17

    Atņemšana, kam seko rezultāta piešķiršana. Piemēram: $a=12; $a -= 5; atbalss $a; // vienāds ar 7

    Reizināšana, kam seko rezultāta piešķiršana: $a=12; $a *= 5; atbalss $a; // vienāds ar 60

    Dalīšana, kam seko rezultāta piešķiršana: $a=12; $a /= 5; atbalss $a; // vienāds ar 2.4

    Savienojiet rindas un piešķiriet rezultātu. Attiecas uz divām rindām. Ja mainīgie glabā nevis virknes, bet, piemēram, skaitļus, tad to vērtības tiek pārveidotas par virknēm un tad tiek veikta darbība: $a=12; $a .= 5; atbalss $a; // vienāds ar 125 // identisks $b="12"; $b .="5"; // vienāds ar 125

    Iegūstot dalījuma atlikumu un pēc tam piešķirot rezultātu: $a=12; $a %= 5; atbalss $a; // ir vienāds ar 2

Salīdzināšanas operācijas

Salīdzināšanas operācijas parasti izmanto nosacītās struktūrās, kad ir jāsalīdzina divas vērtības un, atkarībā no salīdzināšanas rezultāta, jāveic noteiktas darbības. Ir pieejamas šādas salīdzināšanas darbības.

    Vienlīdzības operators salīdzina divas vērtības un, ja tās ir vienādas, atgriež patiesu, pretējā gadījumā atgriež false: $a == 5

    Identitātes operators arī salīdzina divas vērtības un, ja tās ir vienādas, atgriež true, pretējā gadījumā atgriež false: $a === 5

    Salīdzina divas vērtības un, ja tās nav vienādas, atgriež patiesu, pretējā gadījumā atgriež false: $a != 5

    Salīdzina divas vērtības un, ja tās nav vienādas, atgriež patiesu, pretējā gadījumā atgriež false: $a !== 5

    Salīdzina divas vērtības un, ja pirmā ir lielāka par otro, atgriež patiesu, pretējā gadījumā atgriež false: $a > 5

    Salīdzina divas vērtības un, ja pirmā ir mazāka par otro, atgriež patiesu, pretējā gadījumā atgriež false: $a< 5

    Salīdzina divas vērtības un, ja pirmā ir lielāka vai vienāda ar otro, tad atgriež patiesu, pretējā gadījumā atgriež false: $a >= 5

    Salīdzina divas vērtības un, ja pirmā ir mazāka vai vienāda ar otro, atgriež patiesu, pretējā gadījumā atgriež false: $a<= 5

Līdztiesības un identitātes operators

Abi operatori salīdzina divas izteiksmes un atgriež patiesu, ja izteiksmes ir vienādas. Bet starp tām pastāv atšķirības. Ja vienlīdzības operācijai tiek izmantotas divas dažāda veida vērtības, tad tās tiek samazinātas līdz vienai - tā, kuru tulks uzskata par optimālu. Piemēram:

Acīmredzot mainīgie saglabā dažādas dažādu veidu vērtības. Bet, ja salīdzina, tie tiks samazināti līdz tādam pašam tipam - skaitliskam. Un mainīgais $a tiks samazināts līdz skaitlim 22. Un beigās abi mainīgie būs vienādi.

Vai, piemēram, arī šādi mainīgie būs vienādi:

$a = nepatiess; $b = 0;

Lai izvairītos no šādām situācijām, tiek izmantota ekvivalences darbība, kas ņem vērā ne tikai mainīgā lieluma vērtību, bet arī veidu:

$a = "22a"; $b = 22; if($a===$b) atbalss "vienāds"; else atbalss "nav vienāds";

Tagad mainīgie nebūs vienādi.

Nevienlīdzības operatori != un !== darbojas līdzīgi.

Loģiskās operācijas

Loģiskās darbības parasti izmanto, lai apvienotu divu salīdzināšanas darbību rezultātus. Piemēram, mums ir jāveic noteikta darbība, ja ir spēkā vairāki nosacījumi. Ir pieejamas šādas loģiskās darbības:

    Atgriež patiesu, ja abi salīdzinājumi atgriež vērtību True, pretējā gadījumā atgriež false: $a == 5 && $ b = 6

    Līdzīgi kā && darbībai: $a == 5 un $b > 6

    Atgriež vērtību True, ja vismaz viena salīdzināšanas darbība atgriež patieso vērtību, pretējā gadījumā atgriež vērtību false: $a == 5 || $b = 6

    Līdzīgi operācijai || : $a< 5 or $b > 6

    Atgriež patieso vērtību, ja salīdzināšanas darbība atgriež vērtību false: !($a >= 5)

    Atgriež patieso, ja tikai viena no vērtībām ir patiesa. Ja abi ir patiesi vai neviens no tiem nav patiess, atgriež false. Piemēram: $a=12; $b=6; if($a xor $b) echo "patiess"; else atbalss "nepatiess";

    Šeit loģiskās darbības rezultāts būs nepatiess, jo abiem mainīgajiem ir noteikta vērtība. Mainīsim kodu:

    $a=12; $b=NULL; if($a xor $b) echo "patiess"; else atbalss "nepatiess";

    Šeit rezultāts jau būs patiess, jo viena mainīgā vērtība nav iestatīta. Ja mainīgajam ir vērtība NULL, tad loģiskajās operācijās tā vērtība tiks uzskatīta par nepatiesu

Bitu operācijas

Bitu darbības tiek veiktas ar atsevišķiem skaitļa bitiem. Skaitļi tiek aplūkoti binārajā attēlojumā, piemēram, 2 binārajā attēlojumā ir 010, skaitlis 7 ir 111.

    & (loģiskā reizināšana)

    Reizināšana tiek veikta pa bitiem, un, ja abiem operandiem bitu vērtības ir vienādas ar 1, tad darbība atgriež 1, pretējā gadījumā tiek atgriezts skaitlis 0. Piemēram: $a1 = 4; //100 $b1 = 5; //101 echo $a1 & $b1; // vienāds ar 4

    Šeit skaitlis 4 binārajā sistēmā ir 100, un skaitlis 5 ir 101. Reiziniet skaitļus pa bitiem un iegūstiet (1*1, 0*0, 0 *1) = 100, tas ir, skaitli 4 decimālā formātā.

    | (loģisks papildinājums)

    Līdzīgi kā loģiskā reizināšana, darbība tiek veikta arī ar binārajiem cipariem, taču tagad tiek atgriezts viens, ja vismaz vienam skaitlim dotajā ciparā ir viens. Piemēram: $a1 = 4; //100 $b1 = 5; //101 atbalss $a1 | $b1; // vienāds ar 5

    ~ (loģisks noliegums)

    apgriež visus bitus: ja bita vērtība ir 1, tad tā kļūst par nulli un otrādi. $b = 5; atbalss ~$b;

    x<

    x>>y - pārvieto skaitli x pa labi par y cipariem. Piemēram, 16>>1 pārbīda 16 (kas ir 10000 binārajā izteiksmē) vienu vietu pa labi, iegūstot 1000 vai 8 decimāldaļās.

Virkņu savienošana

Punktu operators tiek izmantots, lai savienotu virknes. Piemēram, savienosim vairākas līnijas:

$a="Sveiks,"; $b=" pasaule"; atbalss $a . $b . "!";

Ja mainīgie apzīmē citus veidus, nevis virknes, piemēram, skaitļus, tad to vērtības tiek pārveidotas par virknēm un pēc tam notiek arī virkņu savienošanas darbība.

Nodarbībā tiks apskatīti nosacījuma php priekšraksti: if priekšraksts un slēdzis

PHP nosacītos priekšrakstus attēlo trīs galvenās konstrukcijas:

  • stāvokļa operators ja,
  • slēdzis operatoru slēdzis
  • Un trīskāršs operators.

Apskatīsim katru no tiem tuvāk.

PHP if paziņojums

3.1.attēls. Nosacīts IF paziņojums, īsā versija


Rīsi. 3.2. JA ELSE Nosacījuma paziņojuma sintakse


Rīsi. 3.3. Pilna nosacījuma priekšraksta IF elseif sintakse

Apkoposim:

Pilna sintakse:

if (nosacījums) ( // ja nosacījums ir patiess operators1; operators2; ) elseif(condition) ( operator1; ... ) else ( // ja nosacījums ir nepatiess operators1; operators2; )

  • Saīsinātā sintakse var nesatur citas klauzulas daļas un nesatur papildu elseif nosacījumu
  • Funkcijas vārda elseif vietā varat rakstīt else if (atsevišķi)
  • Vienā if konstrukcijā var būt vairāki elseifs. Tiks izpildīta pirmā elseif izteiksme, kas vienāda ar TRUE.
  • Ja ir alternatīvs elseif nosacījums, klauzulai else jābūt sintakses pēdējai vietai.

Nosacītā paziņojumā var izmantot kolu: cirtainu lencēm vietā. Šajā gadījumā paziņojums beidzas ar palīgvārdu endif

Rīsi. 3.4. Nosacījuma paziņojums If un Endif php

Piemērs:

if($x > $y): echo $x." ir lielāks par ".$y; elseif($x == $y): // lietojot ":", jūs nevarat rakstīt atsevišķi citādi, ja echo $x." ir vienāds ar ".$y; else: echo $x." not > and not = ".$y; endifs;

Svarīgs: Ja konstrukcijā cirtainu lencēšu vietā izmanto kolu, elseif nevar rakstīt divos vārdos!

Loģiskās darbības stāvoklī

Ja nosacījums iekavās var ietvert šādas darbības:

Piemērs: pārbaudiet skaitliskā mainīgā vērtību: ja tā ir mazāka vai vienāda ar 10, parādiet ziņojumu "skaitlis, kas ir mazāks vai vienāds ar 10", pretējā gadījumā parādiet ziņojumu "skaitlis, kas lielāks par 10"


Risinājums:

$skaitlis=15; if ($ numurs<=10) { echo "число меньше или равно 10"; } else { echo "число больше 10"; }

PHP koda blokus var salauzt, apskatīsim piemēru:

Piemērs: Parādiet ekrānā html kodu "a ir vienāds ar 4", ja mainīgais $a patiešām ir vienāds ar 4


1 Risinājums:
1 2 3 4

2 Risinājums:

1 2 3 A ir vienāds ar 4

A ir vienāds ar 4

php darbs 3_1: Parādiet krāsu tulkojumu no angļu valodas krievu valodā, pārbaudot mainīgā vērtību (kurā krāsa ir piešķirta: $a="blue")


php darbs 3_2: Atrodiet maksimālos trīs skaitļus

Salīdzināšanas operācijas un melu noteikums

Ja konstrukcijai iekavās ir jāsatur loģiskā izteiksme vai mainīgais, kas tiek aplūkots no loģikas algebras viedokļa, atgriežot vērtības vai nu patiess, vai nepatiess

Tie. viens mainīgais var darboties kā nosacījums. Apskatīsim piemēru:

1 2 3 4 $a = 1; if ($a) ( atbalss $a; )

$a=1; if ($a) ( atbalss $a; )

Piemērā PHP valodas tulkotājs uzskatīs mainīgo iekavās par melu noteikumu:

MELU noteikums jeb tas, kas tiek uzskatīts par nepatiesu:

  • loģiski Nepatiesi
  • vesela nulle ( 0 )
  • reālā nulle ( 0.0 )
  • tukša rinda un stīgu «0»
  • masīvs bez elementiem
  • objekts bez mainīgajiem
  • īpašs veids NULL

Tādējādi aplūkotajā piemērā mainīgais $a ir vienāds ar vienu, attiecīgi nosacījums būs patiess un operators atbalsosies $a; parādīs mainīgā vērtību.

php darbs 3_3: ir dots mainīgais a ar virknes vērtību. Ja a ir vienāds ar nosaukumu, drukājiet "Sveiks, vārds!", ja a ir vienāds ar tukšu vērtību, tad izvadiet "Sveiks svešiniek!"

Loģiskās konstrukcijas UN VAI un NOT nosacījuma operatorā

  1. Dažkārt ir jāparedz vairāku nosacījumu izpilde vienlaikus. Tad nosacījumi tiek apvienoti loģiskais operators UN — && :
  2. $a=1; if ($a>0 || $a>1) ( atbalss "a > 0 vai a > 1"; )

  3. Lai norādītu, vai nosacījums ir nepatiess, izmantojiet loģiskais operators NAV — ! :
  4. 1 2 3 4 $a = 1; if (! ($a< 0 ) ) { echo "a не < 0" ; }

    $a=1; if (!($a<0)) { echo "a не < 0"; }

Mainīt operatoru PHP

Slēdža operators vai “slēdzis” aizstāj vairākas secīgas if konstrukcijas. To darot, tas salīdzina vienu mainīgo ar vairākām vērtībām. Tādējādi šis ir ērtākais līdzeklis daudznozaru organizēšanai.

Sintakse:

1 2 3 4 5 6 7 8 9 10 slēdzis ($mainīgais) ( case "value1" : operator1 ; break ; case "value2" : operator2 ; break ; case "value3" : operator3 ; break ; [ default : operator4 ; break ; ] )

slēdzis($mainīgais)(lielums "vērtība1": operators1; pārtraukums; gadījums "vērtība2": operators2; pārtraukums; gadījums "vērtība3": operators3; pārtraukums; )

  • Operators var pārbaudīt gan virknes vērtības (pēc tam tās tiek norādītas pēdiņās), gan skaitliskās vērtības (bez pēdiņām).
  • Konstrukcijā ir nepieciešams pārtraukuma paziņojums. Tas iziet no konstrukcijas, ja nosacījums ir patiess un tiek izpildīts nosacījumam atbilstošais operators. Visi lietas paziņojumi tiks izpildīti bez pārtraukuma neatkarīgi no to patiesības.

Rīsi. 3.5. Nosacījuma Switch paziņojums


Piemērs: dots masīvs ar pilniem vīriešu vārdiem. Pārbaudiet pirmo masīva elementu un, atkarībā no nosaukuma, parādiet sveicienu ar īsu nosaukumu.


Risinājums:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $names = masīvs ("Ivans" , "Pēteris" , "Semjons" ) ; slēdzis ($names [ 0 ] ) ( lieta "Pēteris" : atbalss "Sveika, Petja!" ; pārtraukums ; lieta "Ivan" : atbalss "Sveika, Vaņa!" ; pārtraukums ; lieta "Semjons" : atbalss "Sveika, Vaņa! " ; break ; noklusējuma : echo "Sveiki, $names!"; pārtraukums ; )

$names=array("Ivans","Pēteris","Semjons"); switch($names)( case "Pēteris": atbalss "Sveika, Petja!"; break; case "Ivan": atbalss "Sveika, Vaņa!"; break; lieta "Semjons": atbalss "Sveika, Vaņa!"; pārtraukums ; noklusējuma: echo "Sveiki, $names!"; pārtraukums; )

php darbs 3_4:

  • Izveidojiet $day mainīgo un piešķiriet tam patvaļīgu skaitlisku vērtību
  • Izmantojot slēdža konstrukciju, izdrukājiet frāzi "Šī ir darba diena", ja mainīgā $day vērtība ir skaitļu diapazonā no 1 līdz 5 (ieskaitot)
  • Izdrukājiet frāzi "Šī ir brīvdiena", ja mainīgā $day vērtība ir vienāda ar skaitļiem 6 vai 7
  • Izdrukājiet frāzi "Nezināmā diena", ja mainīgā $day vērtība neietilpst skaitļu diapazonā no 1 līdz 7 (ieskaitot)

Aizpildiet kodu:

1 2 3 4 5 6 7 8 9 10 11 12 ... slēdzis (... ) ( 1. gadījums : 2. gadījums : ... atbalss "Šī ir darba diena"; pārtraukums ; 6. gadījums : ... noklusējuma : ... )

Switch(...)( 1. gadījums: 2. gadījums: ... atbalss "Ir darba diena"; pārtraukums; 6. gadījums: ... noklusējuma: ... )

PHP trīskāršais operators

Trīskāršs operators, t.i. ar trim operandiem, ir diezgan vienkārša sintakse, kurā pa kreisi no ? nosacījums ir uzrakstīts, un labajā pusē ir divi operatori, kas atdalīti ar zīmi: , pa kreisi no zīmes operators tiek izpildīts, ja nosacījums ir patiess, un pa labi no zīmes: operators tiek izpildīts, ja nosacījums ir viltus.

stāvoklis? operators1: operators2;

PHP atbalsta šādu standartu loģiskie operatori: "UN" un "&&" (loģiski UN), "OR" un "||" (loģisks VAI), "!" (loģisks NAV) un "XOR" (ekskluzīvs VAI). Tie visi tiek izmantoti loģiskajās izteiksmēs, lai noteiktu vienu vai otru programmas izpildes gaitu atkarībā no izteiksmes atgrieztā rezultāta un attiecas uz binārajiem operatoriem, izņemot operatoru "!" , kas ir unārs. Lietojot loģiskos operatorus, to operandi tiek konvertēti uz Būla datu tipu (), un rezultāts ir atkarīgs no dotajām operandu loģiskajām vērtībām un loģiskā operatora veida (skat. tabulu Nr. 1).

Tabula Nr.1. Loģiskie operatori

Atšķirība starp operatoriem "AND" un "&&" un "OR" un "||" ir tas, ka operatoriem "AND", "OR" un "XOR" ir zemāka prioritāte, kas ir pat zemāka nekā piešķiršanas operatoriem (skatiet PHP operatoru tabulu).

Ir svarīgi saprast, kā tulks apstrādā Būla izteiksmes. Ja izteiksmē ar operatoru "||" pirmajam (kreisajam) operandam būs vērtība true vai izteiksmē ar operatoru "&&" pirmajam operandam būs vērtība false , tad otrais (labais) operands vairs netiks aprēķināts. Tas ir saistīts ar faktu, ka gala rezultāts šādos gadījumos nemainīsies (skat. tabulu Nr. 1), un tāpēc nav jātērē laiks otrā operanda koda apstrādei. Tomēr jums ir jābūt uzmanīgiem, lai neievietotu kodu pareizajā operandā, no kura var būt atkarīga pareiza programmas darbība.

Loģisko operatoru izmantošana parādīta piemērā Nr.2.

nepatiess $a=0||false; //Tagad $a==true, jo 5->patiess un 8->patiess $a=5& //Tagad $a==false, jo "0"->false $a="0"& //Tagad $a==true $a=!false; //Tagad $a==false, jo 5->patiess $a=!5; /* Funkcija foo() netiks izsaukta šuntu dēļ */ $a=(false&&foo()); $b=(true||foo()); $c=(false un foo()); $d=(true vai foo()); /* Atšķirība "||" no "or" un "&&" no "un" */ //Darbojas līdzīgi ($a=(false||true)) $a=false||true; //Rīko kā (($a=false) vai true) $a=false vai true; //Darbojas kā ($a=(false&&true)) $a=false& //Darbojas kā (($a=false) un true) $a=false and true; //Tagad $a==5, darbojas kā (($a=5) x vai 0) $a=5 x vai 0; //Tagad $a==5, darbojas kā (($a=5) un 0) $a=5 un 0; //Tagad $a==5, darbojas kā (($a=5) vai 0) $a=5 vai 0; //Tagad $a==true, darbojas kā ($a=(5||0)) $a=5||0; //Tagad $a==false, darbojas kā ($a=(5&&0)) $a=5& //Tagad $a==true, darbojas kā ($a=(5 x vai 6)) $a=(5 xor 6); ?>

Piemērs Nr.2. Būla operatoru izmantošana

>> Esmu izlasījis dažas no šīm atbildēm un, godīgi sakot, neatradu nevienu, kas izskaidrotu atšķirības starp operatoriem "||" un "OR".

Atšķirība ir izskaidrota saitē uz operatora prioritāti.

"||" operatori tiek novērtēti pirms piešķiršanas ("="), savukārt operatori "vai" tiek novērtēti pēc piešķiršanas. Otrajā piemērā jūs sakāt PHP vispirms piešķirt rezultātu "(choice1 != false ? "hah" : "boo")" $val, pēc tam "vai" to pret pārējo paziņojumu. Izmēģiniet tālāk redzamo piemēru, un jūs redzēsit, ko es domāju (ņemiet vērā papildu iekavas, lai ieviestu prioritāti):

define ("izvēle1" , false );
definēt ("izvēle2" , "suns" );
define ("default1" , "other" );
$val = masīvs();

$val [ "Pārbaude 1" ] = (izvēle1 != false ? "hah" : "boo" ) || (izvēle2 != false ? "hah2" : "boo2" ) || (default1 != false ? "hah3" : "boo3" );
$val [ "Pārbaude 1b" ] = ((izvēle1 != nepatiess ? "hah" : "boo" ) || (izvēle2 != false ? "hah2" : "boo2" ) || (noklusējums1 != nepatiess ? "hah3" " : "boo3" ));
$val [ "Test 2" ] = (choice1 != false ? "hah" : "boo" ) vai (choice2 != false ? "hah2" : "boo2" ) vai (default1 != false ? "hah3" : " boo3" );
$val [ "Tests 2b" ] = ((choice1 != false ? "hah" : "boo" ) vai (choice2 != false ? "hah2" : "boo2" ) vai (default1 != false ? "hah3" : "boo3" ));

Foreach ($val as $test => $result ) (
print("$test: "); var_dump ($rezultāts); drukāt "
\n
\n" ;
}
?>

pārbaudiet vietnē hto dot com

Tā kā OR saīsinājums blokam if var radīt vairāk
lasāms kods ar mazāku mašīnrakstīšanu, ir vilinoši izveidot funkcijas, kas atgriezīs FALSE, ja neveiksmes, vai kādu citu datu tipu, ja tas ir veiksmīgs. Tāpat kā mysql_connect, kas "atgriež MySQL saites identifikatoru veiksmes gadījumā vai FALSE, ja neveiksme".

Iesācējam php php izstrādātājam ir jāizvairās no tādu funkciju izveides, kas var radīt FALSE kļūdas gadījumā un veselu skaitli, ja pastāv iespēja, ka veselais skaitlis varētu būt nulle.

blah blah blah ;
$i = dod_me_liberty () vai mirst ("FATĀLA DB KĻŪDA!");
blah blah blah ;
?>

ironmo67 vietnē yahoo dot com

Atklāja nedaudz kaitinošu atšķirību starp PHP un Perl:


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

nevar pārrakstīt par skaistāko:

funkcija some_function ()( return false;)
some_function () vai return false ;
?>

Tomēr darbosies tālāk norādītais.

funkcija some_function ()( return false;)
some_function() vai die();
?>

Vai varat uzminēt, kāpēc? Vienkārši, die() ir funkcija, un "return" ir paziņojums (tāpat kā atšķirība starp print() un echo, sava veida). Tas tiešām ir slikti, jo man šķiet, ka if(!)() versija ir nogurusi un nelasāma, taču tā ir labāka nekā if (some_c_function == 0) (izdari kaut ko).

Daudzas no tālāk minētajām diskusijām varēja izvairīties, vienkārši skaidri norādot, ka &, | un ^ nav * loģiskie operatori. Tāpēc tie nav norādīti šajā lapā. Tie ir operatori, kas iedarbojas uz skaitļu binārajiem attēlojumiem. Tie neuzņem loģiskās vērtības (t.i., "patiess" vai "false") kā argumentus, iepriekš nepārveidojot tos attiecīgi par skaitļiem 1 un 0. Tie arī neatgriež loģiskās vērtības , bet skaitļi. Protams, vēlāk varat uzskatīt šos skaitļus tā, it kā tie būtu loģiskas vērtības (tādā gadījumā 0 tiek apzīmēts ar "false" un viss pārējais tiek apzīmēts kā "patiess"), bet tas ir sekas PHP tipa apraides noteikumi, un tiem nav nekā kopīga ar operatoru uzvedību.

Ja vēlaties loģiskās darbības, izmantojiet loģiskos operatorus; ja vēlaties veikt bitveida operācijas, izmantojiet bitu operatorus ... viena izmantošana otrai šķiet labs veids, kā sarežģīt lietas.

kws_ vietnē hotpop dot com

"Tikai tāpēc, ka jūs varat, nenozīmē, ka jums vajadzētu."

Es arī uzskatu, ka īssavienojuma novērtēšanas apiešana un paļaušanās uz blakusparādībām nosacījuma izteiksmēs ir slikta stila piekopšana. Rakstīt kodu, kas pats sevi dokumentē, izmantojot skaidras un vienkāršas konstrukcijas, man šķiet daudz labāka prakse nekā sarežģītas un grūti salasāmas izteiksmes izmantošana un izskaidrošana ar komentāriem (vai vēl ļaunāk, to nedokumentēt vispār!) Patiešām, pirmkodam vajadzētu jāraksta programmētāja acīm vairāk nekā datora.

Bitu operatoru izmantošana loģiskā kontekstā var pārkāpt lasītāja cerības un radīt neskaidrības, jo bitu operatori ietver bitu lauka operandus.

Es arī uzskatu, ka, pieņemot, ka īssavienojuma novērtējums ir vislabākais loģiskām konstrukcijām IR kompilatora "tiesību" ietvaros, jo tad, kad loģiskie operatori tiek izmantoti paredzētajam mērķim, pieņēmumi, ka īssavienojums padara *IR* loģiskus, (kārtējo reizi, pareizi lietojot) optimizē loģisko izteiksmju novērtēšanu.

Mans nolūks nav tiešā veidā uzliesmot vai apvainot kādu personu, bet tikai atturēt no slikta stila izmantošanas un mudināt jaunos (un pat dažus pieredzējušus) programmētājus rakstīt skaidru un detalizētu kodu un domāt par programmētājiem, nevis datoriem, kas varētu mēģināt atšifrēt jūsu darbus.

Atbildot uz braintreno:

Otrs jūsu sniegtais piemērs ir pareizais veids, kā to izdarīt! Tā nemaz nav sagrozīta loģika, tā padara jūsu kodu lasāmu, nepaļaujoties uz neskaidrām blakusparādībām!! To ir daudz vieglāk lasīt nekā pirmo, un to ir daudz vieglāk uzturēt.

Lai funkcija CheckThisOrOther() atbalsotu informāciju tikai lietotājam, jums ir jāatņem kodēšanas licence. Ja man kādreiz būtu jāuztur jūsu skripti, es tevi ienīstu.

Tas nav domāts tik liesmām, kā varētu izklausīties! Avota kods nav rakstīts, lai datori izpildītu, bet lai kodētāji lasītu! Paturiet to pie sirds, un jūsu kolēģi jums par to pateiksies!

braintrino

Shadedecho ziņa, lai piespiestu novērtēt abus VAI izteiksmes, patiesībā ir tieši tas, kas jādara, lai novērstu īssavienojuma optimizāciju.

Ir daudz gadījumu, kad jūs nevēlaties, lai kompilators īssavienotu jebkādu novērtējumu, it īpaši, ja vēlaties veikt un/vai situāciju. Īsslēguma novērtējums veic VAI darbību, bet ne UN/VAI darbību!!!

Piemēram, ja es vēlos, lai pārbaudītu lietotāja vaicājuma veidlapu, lai redzētu, vai lietotājs nav atbildējis uz kādu ierakstu UN/VAI, ja lietotājs ir dublējis vienu un to pašu atbildi vairāk nekā vienam ierakstam, man ir jānosūta veidlapa atpakaļ klientam. informējot par to, ko vēlos labot.

Funkcija SomeAnswersAreMissing()
{
...
atbalss "Hmm! Jūs neatbildējāt uz dažiem jautājumiem.";
atgriezt TRUE;
}

Funkcija SomeAnswersAreDuplicated()
{
...
echo "Ai! Var atbildēt uz abiem vienādi.";
atgriezt TRUE;
}

Ja (DažasAnswersAreMissing() || SomeAnswersAreDuplicated())
SendFormAgain();

Ja es to izdarīšu, lietotājs redzēs tikai brīdinājumu par trūkstošo atbildi, bet ne dublētās atbildes brīdinājumu, pat ja abi ir patiesi. Lietotājam tas nav informatīvs, jo viņam/viņai būs atkārtoti jāiesniedz veidlapa divas reizes, pirms viņš/viņa sapratīs visu, ko izdarījis nepareizi, un izjauks uzlaušanu. Tas nav lietotājam draudzīgs.

Ja (DažasAnswersAreMissing() | SomeAnswersAreDuplicated())
SendFormAgain();

Pēc tam abi brīdinājuma ziņojumi tiek nosūtīti vienlaikus, un lietotājs to var labot vienā atkārtotā sūtījumā.

Paldies Shadedecho, es meklēju veidu, kā ignorēt kompilatora stulbo īssavienojumu optimizāciju. Dators nevar vienkārši pieņemt, ka īssavienojums ir labākais:(

BTW, protams, jūs varat darīt:

$you_made_a_kļūda = viltus;

Ja(Trūkst dažas atbildes())

if (SomeAnswersAreDuplicated())
$you_made_a_kļūda = taisnība;

Ja ($jūs_pieļāvāt_kļūdu)
SendFormAgain();

Bet tā ir sašķobīta loģika!!!

hop

Cienījamais iesācējs!

(tā kā es neredzu, ka šādas idejas iezogas pieredzējušu programmētāju prātos...)

Lūdzu, nepievērsiet uzmanību Shadedecho ziņai no 2003. gada 14. marta 04:02! Viņš lielā mērā paļaujas uz neskaidrām blakusparādībām, kas ir ne tikai ļoti slikta programmēšanas prakse, bet arī nesasniedz tādu optimizāciju, kādu viņš domā.

Pareizs veids, kā to izdarīt


atbalss $a;
}

Darbs, ko vēlas Shadedecho, ir (lai gan piemērs kopumā ir diezgan nederīgs):

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

Ja ($a) ( atbalss $a; )

Ja lasīsit diskusiju, uz kuru viņš atsaucas, jūs atklāsiet, ka viņš patiešām vēlējās iegūt visus atšķirīgos ierakstus no divām dažādām db tabulām. Pat tur viņš kļūdās. Pareizais veids, kā to izdarīt, ir apstrādāt pirmo tabulu un pēc tam apstrādāt otro tabulu.
Tas ir ne tikai daudz lasāmāks nekā risinājums ar “|”, bet arī ne mazākā mērā lēnāks.

shadedecho

Šķiet (pēc ilgstošas, bet galu galā noderīgas meklēšanas un diskusijām tādos forumos kā tek-tips), ka
|| un && ir "īssavienojums", kā jau iepriekš minēts, BET | un & operatori (ko PHP dokumentē kā bitu operatorus) attiecīgi darbojas kā to neīsslēgtie ekvivalenti.

Funkcija bla() (
atbalss "sveiks< br>";
atgriezties "no blah()< br>";
}

Funkcija blah2() (
atbalss "pasaule\< br>";
atgriezties "no blah2()< br>";
}

If (($a .= blah()) || ($a .= blah2())) (
atbalss $a;
}

Tā rezultātā tiktu iegūta šāda izvade:

Sveiki
no bla ()

Ņemiet vērā, ka "pasaule" nesaņēma atbalsi"d" un "from blah2()" netika iekļauta mainīgajā $a, jo pirmais uzdevums $a bija veiksmīgs, tāpēc "īssavienojums" sākas un Būla tests tiek pārtraukts, nenovērtējot pārējo.

TOMĒR, ja aizstājat || ar tikai | šajā "ja" paziņojumā jūs saņemat izvadi:

Sveiki
pasaulē
no bla ()
no blah2()

Eureka! visas Būla testa daļas tiek novērtētas sagaidāmajā veidā no kreisās uz labo pusi un ievērojot visus parastos prioritātes noteikumus, cik es redzu.

Tam ir pilnīga jēga... Izmantojot bitu operatorus, notiek bitu līmeņa operācija divu nebitu operāciju (piešķiršanas) rezultātā. Ja operācija bez bitiem atgriež nulli (citiem vārdiem sakot, piešķirtā vērtība izrādās nulle vai 0), bitu operators saistās ar to (vai pareizāk, to "redzētu") kā "0", pretējā gadījumā tas redzētu vērtību, kas nav nulle (bitu virkne ar vismaz vienu "1").

Pēc tam mazliet | tiek darīts ar abām vērtībām, un, ja kāda no vērtībām nav nulle (tajā ir "1" biti), tad rezultātā būs tie "1" biti (kas nav nulle), un paziņojums if interpretēs jebkuru nulles vērtība kā patiesa Būla testā. Tāpat, ja abi operandi uz | būtu nulle vai 0, tad rezultāts būtu nulles vērtība, kas "ja" tiktu interpretēta kā nepatiesa.

Iepriekš minētais if paziņojums darbojas bitu virzienā | uz (šajā gadījumā) divām vērtībām, kas nav nulles (ar "1" tajā bitu līmenī), tāpēc | operācija atgriež vērtību, kas nav nulle, kas pēc tam ar priekšrakstu if tiek atkārtoti interpretēta kā TRUE!

Tātad šajā īpašajā gadījumā, kad mēģināt sarindot kopā neīsslēgtos Būla testus, šie operatori strādā ar saviem operandiem bitu līmenī, un, tā kā tie nav salīdzināšanas operatori, bet gan matemātiski operatori, tie nevar būt īsi. ķēdē, un iegūtā darbība ir bez īssavienojuma "būla tests".

Es zinu, jūs noteikti domājat, ka esmu traks, mēģinot apiet šādu iebūvēto optimizāciju, taču es jums apliecinu, ka tam ir ļoti labs iemesls, un, ja jūs interesē, varat apskatīt šo pavedienu, kā es esmu. ļoti garš ieraksts, kas izskaidro, ko es mēģināju darīt:

Šis ir 9. ieraksts, kurā jūs atradīsiet manu aprakstu par manu datu bāzes vaicājumu, kuru es vēlējos optimizēt.

Kas, iespējams, nav tas, ko vēlaties.

Tas var noderēt tiem, kam patīk, ka viņu kods tiek lasīts kā angļu valodā, un viņi varētu domāt, ka šo operatoru prioritātes atšķirības ir salīdzinoši eksotiskas: tā nav.

Kas attiecas uz mani, es saskāros ar šo problēmu, jo nav simboliskas loģiskas XOR (piemēram, nav ^^), tāpēc man bija jāizmanto XOR, un tad sapratu, ka līdzīgās vietās man vajadzētu izmantot UN un VAI, un tad mana kods sabojājās :)

Tātad tagad man ir jādara
$a = ($b xor $c);

Džesija Tompsons
bend.com

yohgaki vietnē hotmail dot com

PHP4 versijā "and", "or", "&&", "||" -- visi ir "īssavienojums", piemēram, C/C++. PHP3, manuprāt, tā nebija.

"Īsslēgums" nozīmē, ka valoda aptur izteiksmes novērtēšanu, kad tiek noteikti apstākļi. (Lielākā daļa valodu loģiskā stāvokļa noteikšanai izmanto īssavienojuma novērtēšanu)

$a = patiess;
$b = nepatiess;
if ($a || $b) (
}

Šis "ja" paziņojums novērtē tikai $a, jo $a ir patiess un visam nosacījumam ir jābūt patiesam. (t.i., ja $b ir funkcija, nevis vērtība, funkcija netiks izsaukta)

muerte at web-ster dot com

Es cerēju atrast operatoru, kas līdzīgs ||= funkcijām programmā perl. Mana pirmā doma būtu:

$i = $i vai "noklusējums"

Bet vai nedarbojas šādi. Ja vēlaties saviem mainīgajiem piešķirt noklusējuma vērtību tikai tad, ja tie vēl nav piešķirti, varat rīkoties šādi:

$i vai $i = "noklusējums"

Pirmais piemērs NEdarbojas, jo operators vai nav pārslogojams, kā tas ir Perl.

dante at heartme dot com


Es gribēju darīt kaut ko līdzīgu:

$izvēle1 = "";
$izvēle2 = "suns";
$default = "cits";
$val = $izvēle1 || $izvēle2 || $noklusējums;

Bet tad $val1 saturēs tikai 1 vai 0. Tā vietā es izdarīju tā:

$izvēle1 = "";
$izvēle2 = "suns";
$default = "cits";
$val = $izvēle1 vai $izvēle2 vai $noklusējums;

Tagad $val satur virkni "suns". Tas ir
dīvaini, ka "vai" atšķiras no "||"... un es to darītu
domāju, ka "||" jābūt pietiekami gudram, lai tiktu galā
stīgas...kā to dara PERL. Laikam nē. Varbūt tā ir
dizaina izvēle.