<?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.basics.php',
    1 => 'Grundlagen der Aufz&auml;hlungen',
    2 => 'Grundlagen der Aufz&auml;hlungen',
  ),
  'up' => 
  array (
    0 => 'language.enumerations.php',
    1 => 'Aufz&auml;hlungen (Enum)',
  ),
  'prev' => 
  array (
    0 => 'language.enumerations.overview.php',
    1 => '&Uuml;bersicht &uuml;ber Aufz&auml;hlungen',
  ),
  'next' => 
  array (
    0 => 'language.enumerations.backed.php',
    1 => 'Wertgebundene Aufz&auml;hlungen (Backed Enums)',
  ),
  '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.basics" class="sect1">
   <h2 class="title">Grundlagen der Aufzählungen</h2>

   <p class="para">
    Enums sind ähnlich wie Klassen und teilen sich die gleichen Namensräume
    wie Klassen, Schnittstellen und Traits. Sie können auch auf die gleiche
    Weise automatisch geladen werden. Eine Enum definiert einen neuen Typ, der
    eine feste, begrenzte Anzahl von möglichen zulässigen Werten hat.
   </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<br /></span><span style="color: #007700">{<br />    case </span><span style="color: #0000BB">Hearts</span><span style="color: #007700">;<br />    case </span><span style="color: #0000BB">Diamonds</span><span style="color: #007700">;<br />    case </span><span style="color: #0000BB">Clubs</span><span style="color: #007700">;<br />    case </span><span style="color: #0000BB">Spades</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>


   <p class="para">
    Diese Deklaration erzeugt einen neuen Aufzählungstyp namens
    <code class="literal">Suit</code>, der genau vier zulässige Werte hat:
    <code class="literal">Suit::Hearts</code>, <code class="literal">Suit::Diamonds</code>,
    <code class="literal">Suit::Clubs</code>, und <code class="literal">Suit::Spades</code>.
    Variablen kann einer dieser zulässigen Werte zugewiesen werden. Eine
    Funktion kann gegen einen Aufzählungstyp typgeprüft werden; in diesem Fall
    dürfen nur Werte dieses Typs übergeben werden.
   </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">function </span><span style="color: #0000BB">pick_a_card</span><span style="color: #007700">(</span><span style="color: #0000BB">Suit $suit</span><span style="color: #007700">)<br />{<br />    </span><span style="color: #FF8000">/* ... */<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= </span><span style="color: #0000BB">Suit</span><span style="color: #007700">::</span><span style="color: #0000BB">Diamonds</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// OK<br /></span><span style="color: #0000BB">pick_a_card</span><span style="color: #007700">(</span><span style="color: #0000BB">$val</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// OK<br /></span><span style="color: #0000BB">pick_a_card</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 /><br /></span><span style="color: #FF8000">// TypeError: pick_a_card(): Argument #1 ($suit) must be of type Suit, string given<br /></span><span style="color: #0000BB">pick_a_card</span><span style="color: #007700">(</span><span style="color: #DD0000">'Spades'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>


   <p class="para">
    Eine Aufzählung kann null oder mehr <code class="literal">case</code>-Definitionen
    haben, wobei es kein Maximum gibt. Eine Aufzählung mit null Fällen ist
    zwar syntaktisch gültig, aber ziemlich nutzlos.
   </p>

   <p class="para">
    Für Aufzählungsfälle gelten die gleichen Syntaxregeln wie für jedes Label
    in PHP, siehe
    <a href="language.constants.php" class="link">Konstanten</a>.
   </p>

   <p class="para">
    Standardmäßig werden Fälle intern nicht mit einem skalaren Wert verknüpft.
    Das bedeutet, dass <code class="literal">Suit::Hearts</code> nicht gleich
    <code class="literal">&quot;0&quot;</code> ist. Stattdessen wird jeder Fall mit einem
    Singleton-Objekt mit diesem Namen verknüpft. Der folgende Code
    veranschaulicht dies:
   </p>

   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$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: #0000BB">$b </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 /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">=== </span><span style="color: #0000BB">$b</span><span style="color: #007700">; </span><span style="color: #FF8000">// true<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">instanceof </span><span style="color: #0000BB">Suit</span><span style="color: #007700">;  </span><span style="color: #FF8000">// true<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">!== </span><span style="color: #DD0000">'Spades'</span><span style="color: #007700">; </span><span style="color: #FF8000">// true<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>


   <p class="para">
    Es bedeutet auch, dass Enum-Werte niemals <code class="literal">&lt;</code> oder
    <code class="literal">&gt;</code> sind, da diese Vergleiche bei Objekten keinen Sinn
    ergeben. Wenn Enum-Werte auf diese Weise verglichen werden, wird immer
    <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurückgegeben.
   </p>

   <p class="para">
    Eine solche Art von Fall, der keine zugehörigen Daten enthält, wird als
    &quot;Pure Case&quot; (reiner Fall) bezeichnet. Eine Enum, die nur reine Fälle
    enthält, wird als &quot;Pure Enum&quot; bezeichnet.
   </p>

   <p class="para">
    Alle Pure Cases werden als Instanzen ihres Enum-Typs implementiert. Der
    Enum-Typ wird intern als Klasse dargestellt.
   </p>

   <p class="para">
    Alle Fälle haben die schreibgeschützte Eigenschaft
    <code class="literal">name</code>, die den Namen des Falls selbst angibt, wobei
    zwischen Groß- und Kleinschreibung unterschieden wird.
   </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">Spades</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Gibt "Spades" aus<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>


   <p class="para">
    Wenn der Name eines Enum-Falls dynamisch ermittelt wird, ist es auch
    möglich, die Funktionen <span class="function"><a href="function.defined.php" class="function">defined()</a></span> und
    <span class="function"><a href="function.constant.php" class="function">constant()</a></span> zu verwenden, um zu prüfen, ob es den
    Enum-Fall gibt, bzw. diesen auszulesen. Davon wird jedoch abgeraten, da
    die Verwendung von
    <a href="language.enumerations.backed.php" class="link">Wertgebundene Aufzählungen (Backed Enums)</a>
    die meisten Anwendungsfälle abdecken sollte.
   </p>

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