<?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 => 'de',
  ),
  'this' => 
  array (
    0 => 'language.enumerations.backed.php',
    1 => 'Wertgebundene Aufz&auml;hlungen (Backed Enums)',
    2 => 'Wertgebundene Aufz&auml;hlungen (Backed Enums)',
  ),
  'up' => 
  array (
    0 => 'language.enumerations.php',
    1 => 'Aufz&auml;hlungen (Enum)',
  ),
  'prev' => 
  array (
    0 => 'language.enumerations.basics.php',
    1 => 'Grundlagen der Aufz&auml;hlungen',
  ),
  'next' => 
  array (
    0 => 'language.enumerations.methods.php',
    1 => 'Aufz&auml;hlungen und Methoden',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    '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">Wertgebundene Aufzählungen (Backed Enums)</h2>

  <p class="para">
   Standardmäßig haben Enum-Fälle keine skalare Entsprechung. Es handelt sich
   einfach um Singleton-Objekte. In vielen Fällen ist es jedoch auch
   notwendig, einen Enum-Fall von einer Datenbank oder einem ähnlichen
   Datenspeicher zu lesen und in diese zu schreiben, sodass es sinnvoll ist,
   ein intern definiertes skalares (und damit einfach serialisierbares)
   Äquivalent zu haben.
  </p>

  <p class="para">
   Um für eine Aufzählung eine skalare Entsprechung zu definieren, wird
   folgende Syntax verwendet:
  </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">
   Ein Fall, der eine skalare Entsprechung hat, wird als &quot;Backed Case&quot;
   bezeichnet, da er durch einen einfacheren Wert &quot;unterstützt&quot; wird. Eine
   Enum, die ausschließlich Backed Cases enthält, wird als &quot;Backed Enum&quot;
   bezeichnet. Eine Backed Enum kann nur Backed Cases enthalten. Eine Pure
   Enum kann nur Pure Cases enthalten.
  </p>

  <p class="para">
   Eine Backed Enum kann entweder durch den Typ <code class="literal">int</code> oder
   den Typ <code class="literal">string</code> unterstützt werden, wobei eine gegebene
   Aufzählung jeweils nur einen einzigen Typ unterstützt (d. h. der
   Vereinigungstyp <code class="literal">int|string</code> wird nicht unterstützt). Wenn
   eine Aufzählung als &quot;skalar äquivalent&quot; gekennzeichnet ist, müssen alle
   Fälle eine eindeutige, explizit definierte skalare Entsprechung haben. Es
   gibt keine automatisch generierten skalare Entsprechungen (z. B.
   fortlaufende Ganzzahlen). Backed Cases müssen eindeutig sein; zwei Backed
   Enum Cases dürfen nicht dieselbe skalare Entsprechung haben. Eine Konstante
   kann jedoch auf einen Fall verweisen und somit einen Alias erzeugen. Siehe
   <a href="language.enumerations.constants.php" class="link">Aufzählungskonstanten</a>.
  </p>

  <p class="para">
   Die entsprechenden Werte können konstante skalare Ausdrücke sein.
   Vor PHP 8.2.0 mussten die Entsprechungen Literale sein oder literale
   Ausdrücke sein.
   Das bedeutet, dass Konstanten und Ausdrücke mit Konstanten nicht unterstützt
   wurden.
   Das heißt, <code class="code">1 + 1</code> war erlaubt, aber <code class="code">1 + SOME_CONST</code>
   war nicht erlaubt.
  </p>

  <p class="para">
   Backed Cases haben eine zusätzliche schreibgeschützte Eigenschaft,
   <code class="literal">value</code>, die der in der Definition angegebene Wert ist.
  </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">// Gibt "C" aus<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>


  <p class="para">
   Um sicherzustellen, dass die Eigenschaft <code class="literal">value</code>
   schreibgeschützt ist, kann eine Variable nicht als Referenz zugewiesen
   werden. Das bedeutet, dass Folgendes einen Fehler auslöst:
  </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">// Error: Cannot acquire reference to property Suit::$value<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>


  <p class="para">
   Backed Enums implementieren die interne Schnittstelle
   <span class="interfacename"><a href="class.backedenum.php" class="interfacename">BackedEnum</a></span>, die zwei zusätzliche Methoden
   zur Verfügung stellt:
  </p>

  <ul class="simplelist">
   <li>
    <code class="literal">from(int|string): self</code> akzeptiert einen skalaren Wert
    und gibt den entsprechenden Enum-Fall zurück. Wird ein solcher nicht
    gefunden, löst das einen <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> aus. Dies ist
    vor allem in Fällen nützlich, in denen der eingegebene Wert
    vertrauenswürdig ist und ein fehlender Enum-Wert als Fehler angesehen
    werden sollte, der die Anwendung abbricht.
   </li>
   <li>
    <code class="literal">tryFrom(int|string): ?self</code> akzeptiert einen skalaren
    Wert und gibt den entsprechenden Enum-Fall zurück. Wenn keiner gefunden
    wird, wird <code class="literal">null</code> zurückgegeben. Dies ist vor allem in
    Fällen nützlich, in denen der eingegebene Wert nicht vertrauenswürdig ist
    und der Aufrufer seine eigene Fehlerbehandlung oder Logik für
    Standardwerte implementieren möchte.
   </li>
  </ul>

  <p class="para">
   Die Methoden <code class="literal">from()</code> und <code class="literal">tryFrom()</code>
   folgen den Standardregeln für schwache bzw. starke Typisierung. Bei
   schwacher Typisierung ist die Übergabe einer Ganzzahl oder einer
   Zeichenkette zulässig und das System wandelt den Wert entsprechend um. Auch
   Gleitkommazahlen können übergeben werden und werden dann entsprechend
   umgewandelt. Im Modus der strengen Typisierung führt die Übergabe einer
   Ganzzahl an <code class="literal">from()</code> bei einer Enum mit Zeichenketten
   (oder umgekehrt) zu einem <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span>. Für
   Gleitkommazahlen gelten in allen Fällen die gleichen Typisierungsregeln.
   Bei allen anderen Typen wird in beiden Modi ein TypeError ausgelöst.
  </p>

  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><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">// Ungültige Daten führen zu einem ValueError:<br />// "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">// Ungültige Daten ergeben null, also wird stattdessen Suit::Spades verwendet.<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">
   Die manuelle Definition der Methoden <code class="literal">cases()</code> oder
   <code class="literal">tryFrom()</code> führt bei einer Enum zu einem fatalen Fehler.
  </p>

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