> **Note:** Denne artikel kan være lidt rodet for begyndere, da den forudsætter en grundlæggende forståelse af PHP. Hvis du er interesseret i, hvordan betingelser fungerer, kan du læse om betingelser i begynderkurset.
Understøttelse: | Alle versioner: PHP 4, PHP 5, PHP 7 |
---|---|
Kort beskrivelse: | Validering af en eller flere erklæringer |
Type: | Statement, konstrukt (ikke en funktion) |
Ofte skal du afgøre, om en lighed gælder, eller om et udsagn er sandt, og det er det, som betingelser er beregnet til. PHP bruger følgende syntaks ligesom mange andre sprog (især C):
if (/* logisk erklæring */) {// konstruere}
Hvert logisk udtryk har værdien TRUE
(sandt) eller FALSE
(falsk), der er ingen andre muligheder.
Eksempel på sammenligning af, om variablen $x
er større end variablen $y
:
$x = 10;$y = 5;if ($x > $y) {// Denne del af scriptet udføres, hvis betingelsen er sand} else {// Denne del af scriptet køres, hvis betingelsen ikke er opfyldt}
Betingelseskonstruktionen har et obligatorisk indhold i runde parenteser, hvori det udtryk, der skal testes, er angivet, sammensat af operatorer (oversigt nedenfor), flere udtryk kan sammenkædes ved hjælp af logiske operatorer (oversigt nedenfor).
Desuden indeholder betingelsen to valgfrie erklæringsblokke.
Af praktiske årsager skal du altid inkludere mindst den første blok af udsagn, når betingelsen er opfyldt, da det ellers ikke ville give mening at teste udtrykket.
Generelt:
Den eneste mulige notation med et semikolon (undtagen ved brug af endif-konstruktionen):
if ($x > $y);
En sådan betingelse er imidlertid meningsløs, da resultatet af sammenligningen i begge tilfælde vil blive kasseret, og ingen af de sætninger, der hører til betingelsen, vil blive udført.
Under visse omstændigheder kan "hvis"-konstruktionen anvendes uden de sammensatte parenteser. Dette kan kun opnås i følgende tilfælde:
Du kan finde mere detaljerede oplysninger i de følgende 3 kapitler.
1. Kun én kommando ~ forkortet syntaks
Hvis du opretter en betingelse, hvor du kun ønsker at udføre én konstruktion (udsagn), kan du enten bruge den klassiske sammensatte parentes-formulering:
if ($x > 10) { $y = $x; }
Eller vi kan udelade parenteserne:
if ($x > 10) $y = $x;
Denne adfærd gælder dog kun for en kommando i umiddelbar nærhed af tilstanden.
Et bedre eksempel (kun konstruktionen $y = $x
udføres betinget, resten udføres altid):
$x = 5;$y = 3;$z = 10;if ($x > $y)$y = $x;$x = 3;
2. kolon og endif;
if (/* udtryk */):konstrukt;konstrukt;konstrukt;endif;
Denne notation er imidlertid længe blevet betragtet som forældet, fordi den reducerer orienteringen, når flere betingelser er fordybet i hinanden.
Note: Jeg vil gerne bemærke, at denne stil også er populær hos nogle folk, såsom Yuh (Se hans artikel). Gud forbyde, at du bruger det et eller andet sted.
3. Ternært udtryk ~ en enkelt linje "in-line" notation
Det kan være nyttigt at foretage en simpel in-line-sammenligning sammen med en anden handling (f.eks. sammen med definitionen af en ny variabel). Hvis vi kun ønsker at udføre en enkelt erklæring, kan hele proceduren reduceres til en enkelt linje, samtidig med at den holdes så enkel som muligt.
$x = 5;$isBiggerThanTwo = ($x > 2 ? true : false);// eller endnu kortere:$isBiggerThanTwo = ($x > 2);// eller uden parenteser:$isBiggerThanTwo = $x > 2;
Der anvendes to typer af operatorer i betingelsen:
Operatør | Betydning |
---|---|
== |
Lig med |
=== |
Er lig med og har den samme datatype |
!= |
Er ikke lig med |
>= |
Er lig med eller større |
<= |
Er lig med eller mindre |
> |
Større |
< |
Mindre |
Eksempel (gyldigt, når $x ikke er 5
):
if ($x != 5) { ... }
Operatør | Alternativ | Betydning | Sandt når: |
---|---|---|---|
&& |
AND | og samtidig | begge værdier er sande |
` | ` | ||
^^ |
XOR | eksklusiv OR | mindst én er sand eller falsk, men aldrig begge dele |
! |
gør ikke | negation af udtryk | true når false og omvendt |
() |
gør ikke | udtryk negation | afhænger af omstændighederne |
Et mere komplekst eksempel:
$x = 5;$y = 3;$z = 8;if ($x > 0 && !($y != 2 && $z == $x) || $z > $y) { ... }
Ofte kan vi tillade os at udelade en af operatorerne (eller endda begge), men vi må aldrig glemme reglerne for korrekt brug for at få det resulterende udtryk til at fungere.
Når vi tester et udtryk uden en operatør, tester vi generelt, om dets værdi er TRUE
eller ikke-tomt (f.eks. om det indeholder et tal, der ikke er nul, en streng, der ikke er tom, ...).
Eksempler:
$x = 5;$y = 3;$z = 8;if ($x) { ... } // godkendes, fordi $x ikke er tomtif ($x && $y) { ... } // godkendes, fordi $x og $y ikke er tommeif (!$x) { ... } // mislykkes, fordi TRUE er negeretif (isset($z)) { ... } // godkendes, fordi variablen $z findes
Men der kan opstå vanskelige situationer, især når:
hvis ($x)
og variablen $x
indeholder nul (0
), så er betingelsen ikke opfyldt.$x
strengen ``0``` (tallet nul), fordi den overløber til nul, og udtrykket er derfor ikke sandt.'false'
som en streng, er betingelsen igen sand, fordi strengen ikke er tom.Jeg anbefaler en enkel og effektiv løsning på dette problem - spørg efter antallet af tegn, der returneres. Hvis strengen er tom (eller hvis variablen ikke findes), returneres nul tegn, og betingelsen er ikke opfyldt. Et enkelt eksempel:
$x = '0';if ($x) { ... } // betingelsen gælder normalt ikkeif (strlen($x)) { ... } // betingelsen er gyldig, fordi $x indeholder 1 tegn
Dernæst kan vi teste, om en variabel findes ved hjælp af funktionen isset()
.
Det er nemt at finde ud af, at strengene er identiske:
$a = 'Kat';$b = 'cat';if ($a === $b) {// Hvis strengene er de samme} else {// Hvis strengene er forskellige}
Det er vigtigt at holde et godt øje med datatyperne, hvis en post kan være ækvivalent med en anden.
For eksempel er den tomme streng $a = '';
forskellig fra strengen NULL
: $b = NULL;
. Vi er nødt til at skelne mellem dette, f.eks. på grund af databaser, hvor der er forskel på, om en værdi ikke findes eller er tom.
$a = '';$b = null;if ($a == $b) {// Det vil blive evalueret som TRUE, fordi// datatypen konverteres.}if ($a === $b) {// Udfører en meget mere stringent validering// og det vil ikke blive godkendt, fordi det er en anden// indhold og en anden datatype, og derfor// denne kode vil aldrig køre.}
Det er også en god idé at ignorere hvide (usynlige) tegn som f.eks. mellemrum, tabulatorer og linjeskift, når du sammenligner strenge. Dette er f.eks. nyttigt, når du indtaster en adgangskode og sender den til en hashing-funktion:
$password = '81dc9bdb52d04dc20036dbd8313ed055'; // 1234$userPassword = '1234';if (md5(trim($userPassword)) === $password) {// Funktionen trim() sletter automatisk mellemrum.}
Nogle gange kan det ske, at værdien ikke eksisterer (den er hverken TRUE
eller FALSE
), det er hovedsageligt en værdi, der er hentet fra databasen (f.eks. spørger vi efter en kolonne, der ikke eksisterer), i dette tilfælde returneres datatypen NULL
.
Generelt evalueres NULL
som FALSE
, dvs. at betingelsen ikke gælder. Denne fremgangsmåde er dog ikke altid praktisk, da en ikke-eksisterende værdi ikke nødvendigvis betyder, at der ikke findes nogen registrering.
Eksempel fra praksis: Vi har en brugerprofil, og vi forespørger på brugerens webside. Ikke alle brugere behøver at have en webside, så i dette tilfælde returneres
NULL
, men brugeren eksisterer stadig. Så i dette tilfælde bør vi hellere bruge funktionenisset()
til at teste, om variablen (ikke) eksisterer, og ikke drage en konklusion baseret på en bestemt værdi.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | da