<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.enumerations.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'language.enumerations.backed.php',
    1 => '&Eacute;num&eacute;rations avec valeur de base',
    2 => '&Eacute;num&eacute;rations avec valeur de base',
  ),
  'up' => 
  array (
    0 => 'language.enumerations.php',
    1 => 'Les &eacute;num&eacute;rations',
  ),
  'prev' => 
  array (
    0 => 'language.enumerations.basics.php',
    1 => '&Eacute;num&eacute;rations de base',
  ),
  'next' => 
  array (
    0 => 'language.enumerations.methods.php',
    1 => 'M&eacute;thodes d\'&eacute;num&eacute;ration',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'language/enumerations.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.enumerations.backed" class="sect1">
  <h2 class="title">Énumérations avec valeur de base</h2>

  <p class="para">
   Par défaut, les cas énumérés n&#039;ont pas d&#039;équivalent scalaire. Il s&#039;agit simplement d&#039;objets singleton. Cependant,
   il existe de nombreux cas où un cas énuméré doit être capable de faire des allers-retours vers une base de données ou
   système de stockage de données similaire. Il est donc utile d&#039;avoir un équivalent scalaire intégré (et donc trivialement sérialisable) défini
   intrinsèquement.
  </p>

  <p class="para">Pour définir un équivalent scalaire pour une énumération, la syntaxe est la suivante :</p>

  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">enum </span><span style="color: #0000BB">Suit</span><span style="color: #007700">: </span><span style="color: #0000BB">string<br /></span><span style="color: #007700">{<br />    case </span><span style="color: #0000BB">Hearts </span><span style="color: #007700">= </span><span style="color: #DD0000">'H'</span><span style="color: #007700">;<br />    case </span><span style="color: #0000BB">Diamonds </span><span style="color: #007700">= </span><span style="color: #DD0000">'D'</span><span style="color: #007700">;<br />    case </span><span style="color: #0000BB">Clubs </span><span style="color: #007700">= </span><span style="color: #DD0000">'C'</span><span style="color: #007700">;<br />    case </span><span style="color: #0000BB">Spades </span><span style="color: #007700">= </span><span style="color: #DD0000">'S'</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>


  <p class="para">
   Un cas qui a un équivalent scalaire est appelé un cas avec valeur de base ou &quot;Backed Case&quot;, car il est &quot;associé&quot; à
   une valeur plus simple. Une énumération qui contient uniquement des cas avec valeur de base est appelée &quot;énumération avec valeur de base&quot; ou &quot;Backed Enum&quot;.
   Une Enum avec valeur de base ne peut contenir que des cas avec valeur de base. Une Enum pure ne peut contenir que des cas purs.
  </p>

  <p class="para">
   Une Enum avec valeur de base peut être avec des valeurs de types <code class="literal">int</code> ou <code class="literal">string</code>,
   et une énumération donnée ne supporte qu&#039;un seul type à la fois (c&#039;est-à-dire pas d&#039;union de <code class="literal">int|string</code>).
   Si une énumération est marquée comme ayant un équivalent scalaire, tous les cas doivent avoir un équivalent scalaire
   unique défini explicitement. Il n&#039;y a pas d&#039;équivalents scalaires auto-générés
   (par exemple, des entiers séquentiels). Les cas avec valeur de base doivent être uniques ; deux cas enum avec valeur de base
   ne peuvent pas avoir le même équivalent scalaire. Cependant, une constante peut faire référence à un
   cas, créant ainsi un alias. Voir <a href="language.enumerations.constants.php" class="link">Constantes d&#039;énumération</a>.
  </p>

  <p class="para">
   Les valeurs équivalentes peuvent être une expression scalaire constante.
   Avant PHP 8.2.0, les valeurs équivalentes devaient être des littéraux ou des expressions littérales.
   Cela signifie que les constantes et les expressions constantes n&#039;étaient pas supportées.
   Autrement dit, <code class="code">1 + 1</code> était autorisé, mais <code class="code">1 + SOME_CONST</code> ne l&#039;était pas.
  </p>

  <p class="para">
   Les cas avec valeur de base ont une propriété supplémentaire en lecture seule, <code class="literal">value</code>, qui est la valeur
   spécifiée dans la définition.
  </p>

  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">print </span><span style="color: #0000BB">Suit</span><span style="color: #007700">::</span><span style="color: #0000BB">Clubs</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">value</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Affiche "C"<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>


  <p class="para">
   Afin de garantir que la propriété <code class="literal">value</code> reste en lecture seule, une variable ne peut pas
   être assignée en tant que référence à cette propriété. En d&#039;autres termes, l&#039;opération suivante entraîne une erreur :
  </p>

  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$suit </span><span style="color: #007700">= </span><span style="color: #0000BB">Suit</span><span style="color: #007700">::</span><span style="color: #0000BB">Clubs</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$ref </span><span style="color: #007700">= &amp;</span><span style="color: #0000BB">$suit</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">value</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Erreur : Impossible d'acquérir une référence à la propriété Suit::$value<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>


  <p class="para">
   Les enums avec valeur de base implémentent une interface interne <span class="interfacename"><a href="class.backedenum.php" class="interfacename">BackedEnum</a></span>,
   qui expose deux méthodes supplémentaires :
  </p>

  <ul class="simplelist">
   <li>
    <code class="literal">from(int|string): self</code> prend un scalaire et renvoie le cas d'Enum
    correspondant. S'il n'en trouve pas, il lèvera une <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span>. Ceci est principalement
    utile dans les cas où le scalaire en entrée est fiable et où une valeur d'enum manquante devrait être
    considérée comme une erreur qui arrête l'application.
   </li>
   <li>
    <code class="literal">tryFrom(int|string): ?self</code> prend un scalaire et renvoie le
    cas d'Enum correspondant. S'il n'en trouve pas, il retournera <code class="literal">null</code>.
    Ceci est principalement utile dans les cas où le scalaire en entrée n'est pas fiable et que l'appelant souhaite
    implémenter sa propre gestion d'erreur ou sa logique de valeur par défaut.
   </li>
  </ul>

  <p class="para">
   Les méthodes <code class="literal">from()</code> et <code class="literal">tryFrom()</code> suivent les règles
   standard de typage faible/fort. En mode de typage faible, il est possible de passer un entier ou une chaîne de caractères
   et le système forcera la valeur en conséquence. Le passage d&#039;un flottant fonctionnera également et sera
   coercitif. En mode de typage strict, passer un entier à <code class="literal">from()</code> sur une enum avec valeur de base
   de type chaîne de caractères (ou vice versa) entraînera une <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span>,
   tout comme un float dans toutes les circonstances. Tous les autres types de paramètres provoqueront une TypeError
   dans les deux modes.
  </p>

  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$record </span><span style="color: #007700">= </span><span style="color: #0000BB">get_stuff_from_database</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">);<br />print </span><span style="color: #0000BB">$record</span><span style="color: #007700">[</span><span style="color: #DD0000">'suit'</span><span style="color: #007700">];<br /><br /></span><span style="color: #0000BB">$suit </span><span style="color: #007700">=  </span><span style="color: #0000BB">Suit</span><span style="color: #007700">::</span><span style="color: #0000BB">from</span><span style="color: #007700">(</span><span style="color: #0000BB">$record</span><span style="color: #007700">[</span><span style="color: #DD0000">'suit'</span><span style="color: #007700">]);<br /></span><span style="color: #FF8000">// Les données invalides lèvent une ValueError : "X" is not a valid scalar value for enum "Suit"<br /></span><span style="color: #007700">print </span><span style="color: #0000BB">$suit</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">value</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$suit </span><span style="color: #007700">= </span><span style="color: #0000BB">Suit</span><span style="color: #007700">::</span><span style="color: #0000BB">tryFrom</span><span style="color: #007700">(</span><span style="color: #DD0000">'A'</span><span style="color: #007700">) ?? </span><span style="color: #0000BB">Suit</span><span style="color: #007700">::</span><span style="color: #0000BB">Spades</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Les données invalides retournent null, donc Suit::Spades est utilisé à la place.<br /></span><span style="color: #007700">print </span><span style="color: #0000BB">$suit</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">value</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>


  <p class="para">La définition manuelle d&#039;une méthode <code class="literal">from()</code> ou <code class="literal">tryFrom()</code> sur une énumération avec valeur de base entraîne une erreur fatale.</p>

  </div><?php manual_footer($setup); ?>