match: Skillnad mellan sidversioner

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök
Rad 57: Rad 57:
Ovanstående exempel ger utmatningen:
Ovanstående exempel ger utmatningen:


<pre>
string(8) "Tonåring"
string(8) "Tonåring"
 
</pre>
Not: Resultatet av ett match-uttryck behöver inte användas.
Not: Resultatet av ett match-uttryck behöver inte användas.



Versionen från 18 augusti 2024 kl. 07.25

match

(PHP 8)

`match`-uttrycket förgrenar utvärdering baserat på en identitetskontroll av ett värde. Liksom ett `switch`-uttalande har ett `match`-uttryck ett ämnesuttryck som jämförs mot flera alternativ. Till skillnad från `switch` utvärderas det till ett värde, likt ternära uttryck. Till skillnad från `switch` är jämförelsen en identitetskontroll (===) snarare än en svag likhetskontroll (==). `match`-uttryck är tillgängliga från och med PHP 8.0.0.

Exempel #1 Struktur av ett match-uttryck

<?php
$return_value = match (subject_expression) {
    single_conditional_expression => return_expression,
    conditional_expression1, conditional_expression2 => return_expression,
};
?>

Exempel #2 Grundläggande användning av match

<?php
$food = 'cake';

$return_value = match ($food) {
    'apple' => 'Denna mat är ett äpple',
    'bar' => 'Denna mat är en bar',
    'cake' => 'Denna mat är en kaka',
};

var_dump($return_value);
?>

Ovanstående exempel ger utmatningen:

string(19) "Denna mat är en kaka"

Exempel #3 Exempel på användning av match med jämförelseoperatorer

<?php
$age = 18;

$output = match (true) {
    $age < 2 => "Spädbarn",
    $age < 13 => "Barn",
    $age <= 19 => "Tonåring",
    $age > 19 => "Ung vuxen",
    $age >= 40 => "Äldre vuxen"
};

var_dump($output);
?>

Ovanstående exempel ger utmatningen:

string(8) "Tonåring"

Not: Resultatet av ett match-uttryck behöver inte användas.

Not: Ett match-uttryck måste avslutas med ett semikolon ;.

`match`-uttrycket liknar ett `switch`-uttalande men har några nyckelskillnader:

  • En match-gren jämför värden strikt (===) istället för löst som `switch`-uttalandet gör.
  • Ett match-uttryck returnerar ett värde.
  • match-grenar har inte genomslag till senare fall som `switch`-uttalanden gör.
  • Ett match-uttryck måste vara uttömmande.
  • Som `switch`-uttalanden, exekveras `match`-uttryck gren för gren. I början utförs ingen kod. De villkorliga uttrycken utvärderas endast om alla tidigare villkorliga uttryck misslyckats med att matcha ämnesuttrycket. Endast det returnerande uttrycket som motsvarar det matchande villkorliga uttrycket kommer att utvärderas. Till exempel:
<?php
$result = match ($x) {
    foo() => ...,
    $this->bar() => ..., // $this->bar() anropas inte om foo() === $x
    $this->baz => beep(), // beep() anropas inte om inte $x === $this->baz
    // osv.
};
?>

match-uttrycksgrenar kan innehålla flera uttryck separerade med ett komma. Detta är en logisk OR och är en kortform för flera match-grenar med samma höger sida.

<?php
$result = match ($x) {
    // Denna match-gren:
    $a, $b, $c => 5,
    // Är ekvivalent med dessa tre match-grenar:
    $a => 5,
    $b => 5,
    $c => 5,
};
?>

Ett speciellt fall är det förinställda mönstret. Detta mönster matchar något som inte matchades av de andra fallen. Till exempel:

<?php
$expressionResult = match ($condition) {
    1, 2 => foo(),
    3, 4 => bar(),
    default => baz(),
};
?>

Not: Flera förinställda mönster kommer att orsaka ett E_FATAL_ERROR-fel.

Ett match-uttryck måste vara uttömmande. Om ämnesuttrycket inte hanteras av någon match-gren kastas ett UnhandledMatchError.

Exempel #4 Exempel på ett ohanterat match-uttryck

<?php
$condition = 5;

try {
    match ($condition) {
        1, 2 => foo(),
        3, 4 => bar(),
    };
} catch (\UnhandledMatchError $e) {
    var_dump($e);
}
?>

Ovanstående exempel ger utmatningen:

object(UnhandledMatchError)#1 (7) {
  ["message":protected]=>
  string(33) "Unhandled match value of type int"
  ["string":"Error":private]=]>
  string(0) ""
  ["code":protected]=>
  int(0)
  ["file":protected]=>
  string(9) "/in/ICgGK"
  ["line":protected]=>
  int(6)
  ["trace":"Error":private]=>
  array(0) {
  }
  ["previous":"Error":private]=>
  NULL
}

Användning av match-uttryck för att hantera icke-identitetskontroller Det är möjligt att använda ett match-uttryck för att hantera icke-identitetsvillkor genom att använda true som ämnesuttryck.

Exempel #5 Användning av ett generaliserat match-uttryck för att förgrena på heltalsintervall

<?php

$age = 23;

$result = match (true) {
    $age >= 65 => 'senior',
    $age >= 25 => 'vuxen',
    $age >= 18 => 'ung vuxen',
    default => 'barn',
};

var_dump($result);
?>

Ovanstående exempel ger utmatningen:

string(11) "ung vuxen"

Exempel #6 Användning av ett generaliserat match-uttryck för att förgrena på stränginnehåll

<?php

$text = 'Bienvenue chez nous';

$result = match (true) {
    str_contains($text, 'Welcome') || str_contains($text, 'Hello') => 'en',
    str_contains($text, 'Bienvenue') || str_contains($text, 'Bonjour') => 'fr',
    // ...
};

var_dump($result);
?>

Ovanstående exempel ger utmatningen:

string(2) "fr"

Sidslut

Orginalhemsidan på Engelska : https://www.php.net/manual/en/control-structures.match.php
PHP
Språkreferens
Språkreferens#Kontrollstrukturer