Jämförelse: Skillnad mellan sidversioner

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök
Ingen redigeringssammanfattning
 
(12 mellanliggande sidversioner av samma användare visas inte)
Rad 1: Rad 1:
== Jämförelseoperatorer ==
== Jämförelseoperatorer ==
<br>Jämförelseoperatorer, som namnet antyder, tillåter dig att jämföra två värden. Du kanske också är intresserad av att se typernas jämförelsetabeller, eftersom de visar exempel på olika typerelaterade jämförelser.
Jämförelseoperatorer, som namnet antyder, tillåter dig att jämföra två värden. Du kanske också är intresserad av att se typernas jämförelsetabeller, eftersom de visar exempel på olika typerelaterade jämförelser.
<br>
 
<br>=== Jämförelseoperatorer ===
=== Jämförelseoperatorer ===
<br>{| class="wikitable"
{| class="wikitable"
<br>! Exempel !! Namn !! Resultat
! Exempel !! Namn !! Resultat
<br>|-
|-
<br>| $a == $b || Lika || sant om $a är lika med $b efter typomvandling.
| $a == $b || Lika || sant om $a är lika med $b efter typomvandling.
<br>|-
|-
<br>| $a === $b || Identisk || sant om $a är lika med $b, och de är av samma typ.
| $a === $b || Identisk || sant om $a är lika med $b, och de är av samma typ.
<br>|-
|-
<br>| $a != $b || Inte lika || sant om $a inte är lika med $b efter typomvandling.
| $a != $b || Inte lika || sant om $a inte är lika med $b efter typomvandling.
<br>|-
|-
<br>| $a <> $b || Inte lika || sant om $a inte är lika med $b efter typomvandling.
| $a <> $b || Inte lika || sant om $a inte är lika med $b efter typomvandling.
<br>|-
|-
<br>| $a !== $b || Inte identisk || sant om $a inte är lika med $b, eller de är inte av samma typ.
| $a !== $b || Inte identisk || sant om $a inte är lika med $b, eller de är inte av samma typ.
<br>|-
|-
<br>| $a < $b || Mindre än || sant om $a strikt är mindre än $b.
| $a < $b || Mindre än || sant om $a strikt är mindre än $b.
<br>|-
|-
<br>| $a > $b || Större än || sant om $a strikt är större än $b.
| $a > $b || Större än || sant om $a strikt är större än $b.
<br>|-
|-
<br>| $a <= $b || Mindre än eller lika med || sant om $a är mindre än eller lika med $b.
| $a <= $b || Mindre än eller lika med || sant om $a är mindre än eller lika med $b.
<br>|-
|-
<br>| $a >= $b || Större än eller lika med || sant om $a är större än eller lika med $b.
| $a >= $b || Större än eller lika med || sant om $a är större än eller lika med $b.
<br>|-
|-
<br>| $a <=> $b || Rymdskepp || Ett heltal mindre än, lika med, eller större än noll när $a är mindre än, lika med, eller större än $b, respektive.
| $a <=> $b || Rymdskepp || Ett heltal mindre än, lika med, eller större än noll när $a är mindre än, lika med, eller större än $b, respektive.
<br>|}
|}
<br>
 
<br>Om båda operanderna är numeriska strängar, eller en operand är ett nummer och den andra är en numerisk sträng, då görs jämförelsen numeriskt. Dessa regler gäller också för switch-satsen. Typomvandling sker inte när jämförelsen är === eller !== eftersom detta innebär att jämföra både typ och värde.
Om båda operanderna är numeriska strängar, eller en operand är ett nummer och den andra är en numerisk sträng, då görs jämförelsen numeriskt. Dessa regler gäller också för switch-satsen. Typomvandling sker inte när jämförelsen är === eller !== eftersom detta innebär att jämföra både typ och värde.
<br>
 
<br>== Varning ==
== Varning ==
<br>Före PHP 8.0.0, om en sträng jämfördes med ett nummer eller en numerisk sträng, konverterades strängen till ett nummer innan jämförelsen utfördes. Detta kan leda till överraskande resultat som kan ses med följande exempel:
Före PHP 8.0.0, om en sträng jämfördes med ett nummer eller en numerisk sträng, konverterades strängen till ett nummer innan jämförelsen utfördes. Detta kan leda till överraskande resultat som kan ses med följande exempel:
<br>
 
<br><code>
<?php
<br><?php
var_dump(0 == "a");
<br>var_dump(0 == "a");
var_dump("1" == "01");
<br>
var_dump("10" == "1e1");
<br><code>var_dump("1" == "01");
var_dump(100 == "1e2");
<br>
 
<br><code>var_dump("10" == "1e1");
switch ("a") {
<br>
case 0:
<br><code>var_dump(100 == "1e2");switch ("a") {
    echo "0";
<br>case 0:
    break;
<br>    echo "0";
case "a":
<br>    break;
    echo "a";
<br>case "a":
    break;
<br>    echo "a";
}
<br>    break;
?>
<br>}
Utmatningen av ovanstående exempel i PHP 7:
<br>?>
 
<br>Utmatningen av ovanstående exempel i PHP 7:bool(true)
bool(true)
<br>bool(true)
bool(true)
<br>bool(true)
bool(true)
<br>bool(true)
bool(true)
<br>0
0
<br>Utmatningen av ovanstående exempel i PHP 8:
Utmatningen av ovanstående exempel i PHP 8:
<br>bool(false)
 
<br>bool(true)
bool(false)
<br>bool(true)
bool(true)
<br>bool(true)
bool(true)
<br>a
bool(true)
<br>
a
<br><code>
<?php
<br><?php
// Heltal
<br>// Heltal
echo 1 <=> 1; // 0
<br>echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
<br>echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
<br>echo 2 <=> 1; // 1
 
<br>
// Flyttal
<br>// Flyttal
echo 1.5 <=> 1.5; // 0
<br>echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
<br>echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
<br>echo 2.5 <=> 1.5; // 1
 
<br>
// Strängar
<br>// Strängar
echo "a" <=> "a"; // 0
<br>echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
<br>echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
<br>echo "b" <=> "a"; // 1
 
<br>
echo "a" <=> "aa"; // -1
<br>echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1
<br>echo "zz" <=> "aa"; // 1
 
<br>
// Arrayer
<br>// Arrayer
echo [] <=> []; // 0
<br>echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
<br>echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
<br>echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
<br>echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1
<br>echo [1, 2, 3] <=> [1, 2, 4]; // -1
 
<br>
// Objekt
<br>// Objekt
$a = (object) ["a" => "b"];
<br>$a = (object) ["a" => "b"];
$b = (object) ["a" => "b"];
<br>$b = (object) ["a" => "b"];
echo $a <=> $b; // 0
<br>echo $a <=> $b; // 0
 
<br>
$a = (object) ["a" => "b"];
<br>$a = (object) ["a" => "b"];
$b = (object) ["a" => "c"];
<br>$b = (object) ["a" => "c"];
echo $a <=> $b; // -1
<br>echo $a <=> $b; // -1
 
<br>
$a = (object) ["a" => "c"];
<br>$a = (object) ["a" => "c"];
$b = (object) ["a" => "b"];
<br>$b = (object) ["a" => "b"];
echo $a <=> $b; // 1
<br>echo $a <=> $b; // 1
 
<br>
// inte bara värden jämförs; nycklar måste matcha
<br>// inte bara värden jämförs; nycklar måste matcha
$a = (object) ["a" => "b"];
<br>$a = (object) ["a" => "b"];
$b = (object) ["b" => "b"];
<br>$b = (object) ["b" => "b"];
echo $a <=> $b; // 1
<br>echo $a <=> $b; // 1
 
<br>
?>
<br>?>
För olika typer görs jämförelsen enligt följande tabell (i ordning).
<br></code>
 
<br>
== Jämförelse med Olika Typer ==
<br>För olika typer görs jämförelsen enligt följande tabell (i ordning).
Jämförelse baserad på olika typer av operanderna beskrivs i tabellen nedan, som visar hur olika datatyper hanteras när de jämförs i PHP.
<br>
 
<br>Jämförelse med Olika Typer
{| class="wikitable"
<br>Typ av Operand 1 Typ av Operand 2 Resultat
! Typ av Operand 1 !! Typ av Operand 2 !! Resultat
<br>null eller sträng sträng Konvertera null till "", numerisk eller lexikal jämförelse
|-
<br>bool eller null anything Konvertera båda sidorna till bool, false < true
| null eller sträng || sträng || Konvertera null till "", numerisk eller lexikal jämförelse
<br>objekt objekt Inbyggda klasser kan definiera sin egen jämförelse, olika klasser är ojämförbara, samma klass se Objektjämförelse
|-
<br>sträng, resurs, int eller float sträng, resurs, int eller float Omvandla strängar och resurser till nummer, vanlig matematik
| bool eller null || något || Konvertera båda sidor till bool, false < true
<br>array array Array med färre medlemmar är mindre, om nyckel från operand 1 inte finns i operand 2 är arrayerna ojämförbara, annars - jämför värde för värde (se följande exempel)
|-
<br>objekt anything objekt är alltid större
| objekt || objekt || Inbyggda klasser kan definiera sin egen jämförelse, olika klasser är ojämförbara, samma klass se Objektjämförelse
<br>array anything array är alltid större
|-
<br>
| sträng, resurs, int eller float || sträng, resurs, int eller float || Översätt strängar och resurser till nummer, vanlig matematik
<br>= Exempel =
|-
<br>Exempel #1 Boolean/null jämförelse
| array || array || En array med färre medlemmar är mindre, om nyckel från operand 1 inte finns i operand 2 är arrayerna ojämförbara, annars - jämför värde för värde (se följande exempel)
<br><code>
|-
<br><?php
| objekt || något || objekt är alltid större
<br>// Bool och null jämförs alltid som bool
|-
<br>var_dump(1 == TRUE);  // TRUE - samma som (bool)1 == TRUE
| array || något || array är alltid större
<br>var_dump(0 == FALSE); // TRUE - samma som (bool)0 == FALSE
|}
<br>var_dump(100 < TRUE); // FALSE - samma som (bool)100 < TRUE
 
<br>var_dump(-10 < FALSE);// FALSE - samma som (bool)-10 < FALSE
== Exempel ==
<br>var_dump(min(-100, -10, NULL, 10, 100)); // NULL - (bool)NULL < (bool)-100 är FALSE < TRUE
 
<br>?>
Exempel #1 Boolean/null jämförelse
<br></code>
 
<br>
<?php
<br>Exempel #2 Transkription av standard array jämförelse
 
<br><code>
// Bool och null jämförs alltid som bool
<br><?php
 
<br>// Arrayer jämförs så här med standard jämförelseoperatorer samt rymdskeppsoperatören.
var_dump(1 == TRUE);  // TRUE - samma som (bool)1 == TRUE
<br>function standard_array_compare($op1, $op2)
 
<br>{
var_dump(0 == FALSE); // TRUE - samma som (bool)0 == FALSE
<br>    if (count($op1) < count($op2)) {
 
<br>        return -1; // $op1 < $op2
var_dump(100 < TRUE); // FALSE - samma som (bool)100 < TRUE
<br>    } elseif (count($op1) > count($op2)) {
var_dump(-10 < FALSE);// FALSE - samma som (bool)-10 < FALSE
<br>        return 1; // $op1 > $op2
 
<br>    }
var_dump(min(-100, -10, NULL, 10, 100));
<br>    foreach ($op1 as $key => $val) {
 
<br>        if (!array_key_exists($key, $op2)) {
// NULL - (bool)NULL < (bool)-100 är FALSE < TRUE
<br>            return 1;
 
<br>        } elseif ($val < $op2[$key]) {
?>
<br>            return -1;
 
<br>        } elseif ($val > $op2[$key]) {
'''Exempel #2 Transkription av standard array jämförelse'''
<br>            return 1;
 
<br>        }
<?php
<br>    }
 
<br>    return 0; // $op1 == $op2
// Arrayer jämförs så här med standard jämförelseoperatorer samt rymdskeppsoperatören.
<br>
function standard_array_compare($op1, $op2)
<br>
{
<br>}
    if (count($op1) < count($op2)) {
<br>?>
        return -1; // $op1 < $op2
<br></code>
    } elseif (count($op1) > count($op2)) {
<br>== Varning ==
        return 1; // $op1 > $op2
<br>Jämförelse av flyttal
    }
<br>På grund av det sätt som flyttal representeras internt bör du inte testa två flyttal för likhet.
    foreach ($op1 as $key => $val) {
<br>
        if (!array_key_exists($key, $op2)) {
<br>Se dokumentationen för flyttal för mer information.
            return 1;
<br>
        } elseif ($val < $op2[$key]) {
<br>Notera: Var medveten om att PHP:s typomvandling inte alltid är uppenbar när man jämför värden av olika typer, särskilt jämförelser mellan int och bool eller int och strängar. Det är därför generellt rådligt att använda === och !== jämförelser snarare än == och != i de flesta fall.
            return -1;
<br>
        } elseif ($val > $op2[$key]) {
<br>== Ojämförbara Värden ==
            return 1;
<br>Medan identitetsjämförelse (=== och !==) kan tillämpas på godtyckliga värden, bör de andra jämförelseoperatorerna endast tillämpas på jämförbara värden. Resultatet av att jämföra ojämförbara värden är odefinierat och bör inte förlitas på.
        }
<br>
    }
<br>== Se även ==
    return 0; // $op1 == $op2
<br>* [[strcasecmp()]]
}
<br>* [[strcmp()]]
 
<br>* [[Array operators]]
?>
<br>* [[Typer]]
 
<br>== Ternäroperatorn ==
== Varning ==
<br>En annan villkorlig operator är "?:" (eller ternäroperator).
Jämförelse av flyttal
<br>
 
<br>Exempel #3 Tilldela ett standardvärde
På grund av det sätt som flyttal representeras internt bör du inte testa två flyttal för likhet.
<br>
 
<br><code><?php</code>
Se dokumentationen för flyttal för mer information.
<br>
 
<br><code>// Exempel på användning för: Ternäroperator
'''''Notera:''''' Var medveten om att PHP:s typomvandling inte alltid är uppenbar när man jämför värden av olika typer, särskilt jämförelser mellan int och bool eller int och strängar. Det är därför generellt rådligt att använda === och !== jämförelser snarare än == och != i de flesta fall.
<br>$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];</code>
 
<br>
== Ojämförbara Värden ==
<br><code>// Ovanstående är identiskt med detta if/else-uttalande
Medan identitetsjämförelse (=== och !==) kan tillämpas på godtyckliga värden, bör de andra jämförelseoperatorerna endast tillämpas på jämförbara värden. Resultatet av att jämföra ojämförbara värden är odefinierat och bör inte förlitas på.
<br>if (empty($_POST['action'])) {</code>
 
<br>    <code>$action = 'default';</code>
== Se även ==
<br><code>} else {</code>
* [[strcasecmp()]]
<br>    <code>$action = $_POST['action'];</code>
* [[strcmp()]]
<br><code>}</code>
* [[Array operators]]
<br>
* [[Typer]]
<br><code>?></code>
== Ternäroperatorn ==
<br>
En annan villkorlig operator är "?:" (eller ternäroperator).
<br>Uttrycket (expr1) ? (expr2) : (expr3) utvärderas till expr2 om expr1 utvärderas till sant, och expr3 om expr1 utvärderas till falskt.
 
<br>Det är möjligt att utelämna den mellersta delen av ternäroperatören. Uttrycket expr1 ?: expr3 utvärderas till resultatet av expr1 om expr1 utvärderas till sant, och annars expr3. expr1 utvärderas endast en gång i detta fall.
Exempel #3 Tilldela ett standardvärde
<br>
 
<br>'''Notera:'''  
<?php
<br>
 
<br>Observera att ternäroperatorn är ett uttryck, och att den inte utvärderas till en variabel, utan till resultatet av ett uttryck. Detta är viktigt att veta om du vill returnera en variabel med referens. Uttalandet return $var == 42 ? $a : $b; i en return-by-reference-funktion kommer därför inte att fungera och en varning utfärdas.
// Exempel på användning för: Ternäroperator
<br>
 
<br>'''Notera:'''
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
<br>
 
<br>Det rekommenderas att undvika "staplade" ternära uttryck. PHP:s beteende när man använder mer än en oparanteserad ternär operator inom ett enda uttryck är inte uppenbart jämfört med andra språk. Faktum är att före PHP 8.0.0 utvärderades ternära uttryck vänsterassociativt, istället för högerassociativt som i de flesta andra programmeringsspråk. Att förlita sig på vänsterassociativitet är föråldrat från och med PHP 7.4.0. Från och med PHP 8.0.0 är ternäroperatören icke-associativ.
// Ovanstående är identiskt med detta if/else-uttalande
<br>
if (empty($_POST['action'])) {
<br>Exempel #4 Icke-uppenbart Ternärt Beteende
    $action = 'default';
<br>
} else {
<br><code><?php
    $action = $_POST['action'];
<br>
}
<br>// vid första anblicken verkar följande skriva ut 'true'
 
<br>echo (true ? 'true' : false ? 't' : 'f');</code>
?>
<br>
 
<br>// dock är den faktiska utmatningen av ovanstående 't' före PHP 8.0.0
Uttrycket (expr1) ? (expr2) : (expr3) utvärderas till expr2 om expr1 utvärderas till sant, och expr3 om expr1 utvärderas till falskt.
<br>// detta är för att ternära uttryck är vänsterassociativa</code>
 
<br>// följande är en mer uppenbar version av samma kod som ovan</code>
Det är möjligt att utelämna den mellersta delen av ternäroperatören. Uttrycket expr1 ?: expr3 utvärderas till resultatet av expr1 om expr1 utvärderas till sant, och annars expr3. expr1 utvärderas endast en gång i detta fall.
<br>echo ((true ? 'true' : false) ? 't' : 'f');
 
<br>// här kan man se att det första uttrycket utvärderas till 'true', vilket
'''Notera:''' Observera att ternäroperatorn är ett uttryck, och att den inte utvärderas till en variabel, utan till resultatet av ett uttryck. Detta är viktigt att veta om du vill returnera en variabel med referens. Uttalandet return $var == 42 ? $a : $b; i en return-by-reference-funktion kommer därför inte att fungera och en varning utfärdas.
<br>// i sin tur utvärderas till (bool)true, och därmed returnerar den sanna grenen av
 
<br>// det andra ternära uttrycket.
'''Notera:'''
<br>
 
<br>?></code>
Det rekommenderas att undvika "staplade" ternära uttryck. PHP:s beteende när man använder mer än en oparanteserad ternär operator inom ett enda uttryck är inte uppenbart jämfört med andra språk. Faktum är att före PHP 8.0.0 utvärderades ternära uttryck vänsterassociativt, istället för högerassociativt som i de flesta andra programmeringsspråk. Att förlita sig på vänsterassociativitet är föråldrat från och med PHP 7.4.0. Från och med PHP 8.0.0 är ternäroperatören icke-associativ.
<br>
 
<br>'''Notera:'''
Exempel #4 Icke-uppenbart Ternärt Beteende
<br>
 
<br>'''Kedjning av korta ternärer (?:) är stabil och beter sig rimligt. Det kommer att utvärderas till det första argumentet som utvärderas till ett icke-falskt värde. Notera att odefinierade värden fortfarande kommer att orsaka en varning.'''
<?php
<br>
 
<br>Exempel #5 Kort-ternär kedjning
// vid första anblicken verkar följande skriva ut 'true'
<br>
 
<br><code><?php</code>
echo (true ? 'true' : false ? 't' : 'f');
<br>
 
<br><code>echo 0 ?: 1 ?: 2 ?: 3, PHP_EOL; //1
// dock är den faktiska utmatningen av ovanstående 't' före PHP 8.0.0
<br>echo 0 ?: 0 ?: 2 ?: 3, PHP_EOL; //2</code>
 
<br>
// detta är för att ternära uttryck är vänsterassociativa
<br><code>echo 0 ?: 0 ?: 0 ?: 3, PHP_EOL; //3</code>
 
<br>
// följande är en mer uppenbar version av samma kod som ovan
<br><code>?></code>
 
<br>== Nullsammanfogningsoperatorn ==
echo ((true ? 'true' : false) ? 't' : 'f');
<br>En annan användbar kortfattad operator är "??" (eller nullsammanfogningsoperatorn).
 
<br>
// här kan man se att det första uttrycket utvärderas till 'true', vilket
<br>Exempel #6 Tilldela ett standardvärde
 
<br>
// i sin tur utvärderas till (bool)true, och därmed returnerar den sanna grenen av
<br><code><?php</code>
// det andra ternära uttrycket.
<br>
?>
<br><code>// Exempel på användning för: Null Coalesce Operator</code>
 
<br>
'''Notera:'''
<br><code>$action = $_POST['action'] ?? 'default';</code>
 
<br>
Kedjning av korta ternärer (?:) är stabil och beter sig rimligt. Det kommer att utvärderas till det första argumentet som utvärderas till ett icke-falskt värde. Notera att odefinierade värden fortfarande kommer att orsaka en varning.
<br><code>// Ovanstående är identiskt med detta if/else-uttalande</code>
 
<br>
Exempel #5 Kort-ternär kedjning
<br><code>if (isset($_POST['action'])) {</code>
 
<br>    <code>$action = $_POST['action'];</code>
<?php
<br><code>} else {</code>
 
<br>    <code>$action = 'default';</code>
echo 0 ?: 1 ?: 2 ?: 3, PHP_EOL; //1
<br><code>}</code>
 
<br>
echo 0 ?: 0 ?: 2 ?: 3, PHP_EOL; //2
<br><code>?></code>
echo 0 ?: 0 ?: 0 ?: 3, PHP_EOL; //3
<br>
 
<br>Uttrycket (expr1) ?? (expr2) utvärderas till expr2 om expr1 är null, och expr1 annars.
?>
<br>
== Nullsammanfogningsoperatorn ==
<br>I synnerhet genererar denna operator inte ett meddelande eller en varning om värdet på vänster sida inte finns, precis som isset(). Detta är särskilt användbart för arraynycklar.
En annan användbar kortfattad operator är "??" (eller nullsammanfogningsoperatorn).
<br>
 
<br>Notera: Observera att nullsammanfogningsoperatorn är ett uttryck, och att den inte utvärderas till en variabel, utan till resultatet av ett uttryck. Detta är viktigt att veta om du vill returnera en variabel med referens. Uttalandet return $foo ?? $bar; i en return-by-reference-funktion kommer därför inte att fungera och en varning utfärdas.
Exempel #6 Tilldela ett standardvärde
<br>
 
<br>Notera:
<?php
<br>
 
<br>Nullsammanfogningsoperatorn har låg prioritet. Det innebär att om den blandas med andra operatorer (som strängkonkatenering eller aritmetiska operatorer) kommer parenteser sannolikt att krävas.
// Exempel på användning för: Null Coalesce Operator
<br>
 
<br><code><?php</code>
$action = $_POST['action'] ?? 'default';
<br>
 
<br><code>// Väcker en varning att $name är odefinierad.
// Ovanstående är identiskt med detta if/else-uttalande
<br>print 'Mr. ' . $name ?? 'Anonymous';</code>
 
<br>
if (isset($_POST['action'])) {
<br><code>// Skriver ut "Mr. Anonymous"
    $action = $_POST['action'];
<br>print 'Mr. ' . ($name ?? 'Anonymous');</code>
} else {
<br>
    $action = 'default';
<br><code>?></code>
}
<br>
 
<br>'''Notera:'''
?>
<br>
 
<br>'''Observera att nullsammanfogningsoperatorn tillåter enkel nesting:'''
Uttrycket (expr1) ?? (expr2) utvärderas till expr2 om expr1 är null, och expr1 annars.
<br>
I synnerhet genererar denna operator inte ett meddelande eller en varning om värdet på vänster sida inte finns, precis som isset(). Detta är särskilt användbart för arraynycklar.
<br>Exempel #7 Nesting nullsammanfogningsoperatorn
 
<br>
'''''Notera:''' Observera att nullsammanfogningsoperatorn är ett uttryck, och att den inte utvärderas till en variabel, utan till resultatet av ett uttryck. Detta är viktigt att veta om du vill returnera en variabel med referens. Uttalandet return $foo ?? $bar; i en return-by-reference-funktion kommer därför inte att fungera och en varning utfärdas.''
<br><code><?php</code>
 
<br>
'''Notera:'''
<br><code>$foo = null;</code>
 
<br>
Nullsammanfogningsoperatorn har låg prioritet. Det innebär att om den blandas med andra operatorer (som strängkonkatenering eller aritmetiska operatorer) kommer parenteser sannolikt att krävas.
<br><code>$bar = null;</code>
 
<br>
<?php
<br><code>$baz = 1;</code>
 
<br>
/ Väcker en varning att $name är odefinierad.
<br><code>$qux = 2;</code>
print 'Mr. ' . $name ?? 'Anonymous';
<br>
 
<br><code>echo $foo ?? $bar ?? $baz ?? $qux; // ger 1</code>
// Skriver ut "Mr. Anonymous"
<br>
print 'Mr. ' . ($name ?? 'Anonymous');
<br><code>?></code>
 
<br>
?>
<br>[[PHP]]
 
<br>
'''Notera:'''
<br>[[Språkreferens]]
 
<br>
Observera att nullsammanfogningsoperatorn tillåter enkel nesting:
<br>Sida är en översättning ifrån https://www.php.net/manual/en/language.operators.comparison.php
 
<br>
Exempel #7 Nesting nullsammanfogningsoperatorn
<br>
 
<?php
 
$foo = null;
$bar = null;
$baz = 1;
$qux = 2;
 
echo $foo ?? $bar ?? $baz ?? $qux; // ger 1
?><BR>
[[PHP]]<BR>
[[Språkreferens]]
 
https://www.php.net/manual/en/language.operators.comparison.php  
[[Kategori:Php]]

Nuvarande version från 17 augusti 2024 kl. 06.38

Jämförelseoperatorer

Jämförelseoperatorer, som namnet antyder, tillåter dig att jämföra två värden. Du kanske också är intresserad av att se typernas jämförelsetabeller, eftersom de visar exempel på olika typerelaterade jämförelser.

Jämförelseoperatorer

Exempel Namn Resultat
$a == $b Lika sant om $a är lika med $b efter typomvandling.
$a === $b Identisk sant om $a är lika med $b, och de är av samma typ.
$a != $b Inte lika sant om $a inte är lika med $b efter typomvandling.
$a <> $b Inte lika sant om $a inte är lika med $b efter typomvandling.
$a !== $b Inte identisk sant om $a inte är lika med $b, eller de är inte av samma typ.
$a < $b Mindre än sant om $a strikt är mindre än $b.
$a > $b Större än sant om $a strikt är större än $b.
$a <= $b Mindre än eller lika med sant om $a är mindre än eller lika med $b.
$a >= $b Större än eller lika med sant om $a är större än eller lika med $b.
$a <=> $b Rymdskepp Ett heltal mindre än, lika med, eller större än noll när $a är mindre än, lika med, eller större än $b, respektive.

Om båda operanderna är numeriska strängar, eller en operand är ett nummer och den andra är en numerisk sträng, då görs jämförelsen numeriskt. Dessa regler gäller också för switch-satsen. Typomvandling sker inte när jämförelsen är === eller !== eftersom detta innebär att jämföra både typ och värde.

Varning

Före PHP 8.0.0, om en sträng jämfördes med ett nummer eller en numerisk sträng, konverterades strängen till ett nummer innan jämförelsen utfördes. Detta kan leda till överraskande resultat som kan ses med följande exempel:

<?php var_dump(0 == "a"); var_dump("1" == "01"); var_dump("10" == "1e1"); var_dump(100 == "1e2");

switch ("a") { case 0:

   echo "0";
   break;

case "a":

   echo "a";
   break;

} ?> Utmatningen av ovanstående exempel i PHP 7:

bool(true) bool(true) bool(true) bool(true) 0 Utmatningen av ovanstående exempel i PHP 8:

bool(false) bool(true) bool(true) bool(true) a <?php // Heltal echo 1 <=> 1; // 0 echo 1 <=> 2; // -1 echo 2 <=> 1; // 1

// Flyttal echo 1.5 <=> 1.5; // 0 echo 1.5 <=> 2.5; // -1 echo 2.5 <=> 1.5; // 1

// Strängar echo "a" <=> "a"; // 0 echo "a" <=> "b"; // -1 echo "b" <=> "a"; // 1

echo "a" <=> "aa"; // -1 echo "zz" <=> "aa"; // 1

// Arrayer echo [] <=> []; // 0 echo [1, 2, 3] <=> [1, 2, 3]; // 0 echo [1, 2, 3] <=> []; // 1 echo [1, 2, 3] <=> [1, 2, 1]; // 1 echo [1, 2, 3] <=> [1, 2, 4]; // -1

// Objekt $a = (object) ["a" => "b"]; $b = (object) ["a" => "b"]; echo $a <=> $b; // 0

$a = (object) ["a" => "b"]; $b = (object) ["a" => "c"]; echo $a <=> $b; // -1

$a = (object) ["a" => "c"]; $b = (object) ["a" => "b"]; echo $a <=> $b; // 1

// inte bara värden jämförs; nycklar måste matcha $a = (object) ["a" => "b"]; $b = (object) ["b" => "b"]; echo $a <=> $b; // 1

?> För olika typer görs jämförelsen enligt följande tabell (i ordning).

Jämförelse med Olika Typer

Jämförelse baserad på olika typer av operanderna beskrivs i tabellen nedan, som visar hur olika datatyper hanteras när de jämförs i PHP.

Typ av Operand 1 Typ av Operand 2 Resultat
null eller sträng sträng Konvertera null till "", numerisk eller lexikal jämförelse
bool eller null något Konvertera båda sidor till bool, false < true
objekt objekt Inbyggda klasser kan definiera sin egen jämförelse, olika klasser är ojämförbara, samma klass se Objektjämförelse
sträng, resurs, int eller float sträng, resurs, int eller float Översätt strängar och resurser till nummer, vanlig matematik
array array En array med färre medlemmar är mindre, om nyckel från operand 1 inte finns i operand 2 är arrayerna ojämförbara, annars - jämför värde för värde (se följande exempel)
objekt något objekt är alltid större
array något array är alltid större

Exempel

Exempel #1 Boolean/null jämförelse

<?php

// Bool och null jämförs alltid som bool

var_dump(1 == TRUE); // TRUE - samma som (bool)1 == TRUE

var_dump(0 == FALSE); // TRUE - samma som (bool)0 == FALSE

var_dump(100 < TRUE); // FALSE - samma som (bool)100 < TRUE var_dump(-10 < FALSE);// FALSE - samma som (bool)-10 < FALSE

var_dump(min(-100, -10, NULL, 10, 100));

// NULL - (bool)NULL < (bool)-100 är FALSE < TRUE

?>

Exempel #2 Transkription av standard array jämförelse

<?php

// Arrayer jämförs så här med standard jämförelseoperatorer samt rymdskeppsoperatören. function standard_array_compare($op1, $op2) {

   if (count($op1) < count($op2)) {
       return -1; // $op1 < $op2
   } elseif (count($op1) > count($op2)) {
       return 1; // $op1 > $op2
   }
   foreach ($op1 as $key => $val) {
       if (!array_key_exists($key, $op2)) {
           return 1;
       } elseif ($val < $op2[$key]) {
           return -1;
       } elseif ($val > $op2[$key]) {
           return 1;
       }
   }
   return 0; // $op1 == $op2

}

?>

Varning

Jämförelse av flyttal

På grund av det sätt som flyttal representeras internt bör du inte testa två flyttal för likhet.

Se dokumentationen för flyttal för mer information.

Notera: Var medveten om att PHP:s typomvandling inte alltid är uppenbar när man jämför värden av olika typer, särskilt jämförelser mellan int och bool eller int och strängar. Det är därför generellt rådligt att använda === och !== jämförelser snarare än == och != i de flesta fall.

Ojämförbara Värden

Medan identitetsjämförelse (=== och !==) kan tillämpas på godtyckliga värden, bör de andra jämförelseoperatorerna endast tillämpas på jämförbara värden. Resultatet av att jämföra ojämförbara värden är odefinierat och bör inte förlitas på.

Se även

Ternäroperatorn

En annan villkorlig operator är "?:" (eller ternäroperator).

Exempel #3 Tilldela ett standardvärde

<?php

// Exempel på användning för: Ternäroperator

$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];

// Ovanstående är identiskt med detta if/else-uttalande if (empty($_POST['action'])) {

   $action = 'default';

} else {

   $action = $_POST['action'];

}

?>

Uttrycket (expr1) ? (expr2) : (expr3) utvärderas till expr2 om expr1 utvärderas till sant, och expr3 om expr1 utvärderas till falskt.

Det är möjligt att utelämna den mellersta delen av ternäroperatören. Uttrycket expr1 ?: expr3 utvärderas till resultatet av expr1 om expr1 utvärderas till sant, och annars expr3. expr1 utvärderas endast en gång i detta fall.

Notera: Observera att ternäroperatorn är ett uttryck, och att den inte utvärderas till en variabel, utan till resultatet av ett uttryck. Detta är viktigt att veta om du vill returnera en variabel med referens. Uttalandet return $var == 42 ? $a : $b; i en return-by-reference-funktion kommer därför inte att fungera och en varning utfärdas.

Notera:

Det rekommenderas att undvika "staplade" ternära uttryck. PHP:s beteende när man använder mer än en oparanteserad ternär operator inom ett enda uttryck är inte uppenbart jämfört med andra språk. Faktum är att före PHP 8.0.0 utvärderades ternära uttryck vänsterassociativt, istället för högerassociativt som i de flesta andra programmeringsspråk. Att förlita sig på vänsterassociativitet är föråldrat från och med PHP 7.4.0. Från och med PHP 8.0.0 är ternäroperatören icke-associativ.

Exempel #4 Icke-uppenbart Ternärt Beteende

<?php

// vid första anblicken verkar följande skriva ut 'true'

echo (true ? 'true' : false ? 't' : 'f');

// dock är den faktiska utmatningen av ovanstående 't' före PHP 8.0.0

// detta är för att ternära uttryck är vänsterassociativa

// följande är en mer uppenbar version av samma kod som ovan

echo ((true ? 'true' : false) ? 't' : 'f');

// här kan man se att det första uttrycket utvärderas till 'true', vilket

// i sin tur utvärderas till (bool)true, och därmed returnerar den sanna grenen av // det andra ternära uttrycket. ?>

Notera:

Kedjning av korta ternärer (?:) är stabil och beter sig rimligt. Det kommer att utvärderas till det första argumentet som utvärderas till ett icke-falskt värde. Notera att odefinierade värden fortfarande kommer att orsaka en varning.

Exempel #5 Kort-ternär kedjning

<?php

echo 0 ?: 1 ?: 2 ?: 3, PHP_EOL; //1

echo 0 ?: 0 ?: 2 ?: 3, PHP_EOL; //2 echo 0 ?: 0 ?: 0 ?: 3, PHP_EOL; //3

?>

Nullsammanfogningsoperatorn

En annan användbar kortfattad operator är "??" (eller nullsammanfogningsoperatorn).

Exempel #6 Tilldela ett standardvärde

<?php

// Exempel på användning för: Null Coalesce Operator

$action = $_POST['action'] ?? 'default';

// Ovanstående är identiskt med detta if/else-uttalande

if (isset($_POST['action'])) {

   $action = $_POST['action'];

} else {

   $action = 'default';

}

?>

Uttrycket (expr1) ?? (expr2) utvärderas till expr2 om expr1 är null, och expr1 annars. I synnerhet genererar denna operator inte ett meddelande eller en varning om värdet på vänster sida inte finns, precis som isset(). Detta är särskilt användbart för arraynycklar.

Notera: Observera att nullsammanfogningsoperatorn är ett uttryck, och att den inte utvärderas till en variabel, utan till resultatet av ett uttryck. Detta är viktigt att veta om du vill returnera en variabel med referens. Uttalandet return $foo ?? $bar; i en return-by-reference-funktion kommer därför inte att fungera och en varning utfärdas.

Notera:

Nullsammanfogningsoperatorn har låg prioritet. Det innebär att om den blandas med andra operatorer (som strängkonkatenering eller aritmetiska operatorer) kommer parenteser sannolikt att krävas.

<?php

/ Väcker en varning att $name är odefinierad. print 'Mr. ' . $name ?? 'Anonymous';

// Skriver ut "Mr. Anonymous" print 'Mr. ' . ($name ?? 'Anonymous');

?>

Notera:

Observera att nullsammanfogningsoperatorn tillåter enkel nesting:

Exempel #7 Nesting nullsammanfogningsoperatorn

<?php

$foo = null; $bar = null; $baz = 1; $qux = 2;

echo $foo ?? $bar ?? $baz ?? $qux; // ger 1 ?>
PHP
Språkreferens

https://www.php.net/manual/en/language.operators.comparison.php