<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Kommentare zu: Enums in PHP (sicher ist sicher)</title>
	<atom:link href="http://blog.ebene7.com/2010/10/08/enums-in-php-sicher-ist-sicher/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ebene7.com/2010/10/08/enums-in-php-sicher-ist-sicher/</link>
	<description></description>
	<lastBuildDate>Wed, 19 Dec 2018 08:31:45 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<item>
		<title>Von: Beat Richli</title>
		<link>https://blog.ebene7.com/2010/10/08/enums-in-php-sicher-ist-sicher/comment-page-1/#comment-57093</link>
		<dc:creator>Beat Richli</dc:creator>
		<pubDate>Mon, 17 Sep 2018 00:30:22 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ebene7.com/?p=1586#comment-57093</guid>
		<description>Ich verwende folgendes um ein enum-ähnliches Verhalten zu erhalten und gleichzeitig ein bisschen Logik einbauen zu können. Man kann den key-namen holen, oder den hinterlegten und übersetzten Wert:

namespace MyEnums;

class OrderStatus {
    public static function Cart($val = false) {
        return ($val) ? __(&quot;In cart&quot;) : __FUNCTION__;
    }
    public static function Partial($val = false) {
        return ($val) ? __(&quot;Partial payment&quot;) : __FUNCTION__;
    }
    public static function Paid($val = false) {
        return ($val) ? __(&quot;Paid&quot;) : __FUNCTION__;
    }
}


Beispiel:
       echo &#039;key: &#039;.\MyEnums\OrderStatus::Cart();
       echo &#039;value: &#039;.\MyEnums\OrderStatus::Cart(true);</description>
		<content:encoded><![CDATA[<p>Ich verwende folgendes um ein enum-ähnliches Verhalten zu erhalten und gleichzeitig ein bisschen Logik einbauen zu können. Man kann den key-namen holen, oder den hinterlegten und übersetzten Wert:</p>
<p>namespace MyEnums;</p>
<p>class OrderStatus {<br />
    public static function Cart($val = false) {<br />
        return ($val) ? __(&#8220;In cart&#8221;) : __FUNCTION__;<br />
    }<br />
    public static function Partial($val = false) {<br />
        return ($val) ? __(&#8220;Partial payment&#8221;) : __FUNCTION__;<br />
    }<br />
    public static function Paid($val = false) {<br />
        return ($val) ? __(&#8220;Paid&#8221;) : __FUNCTION__;<br />
    }<br />
}</p>
<p>Beispiel:<br />
       echo &#8216;key: &#8216;.\MyEnums\OrderStatus::Cart();<br />
       echo &#8216;value: &#8216;.\MyEnums\OrderStatus::Cart(true);</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Klaus Potzesny</title>
		<link>https://blog.ebene7.com/2010/10/08/enums-in-php-sicher-ist-sicher/comment-page-1/#comment-44396</link>
		<dc:creator>Klaus Potzesny</dc:creator>
		<pubDate>Thu, 12 Feb 2015 22:08:08 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ebene7.com/?p=1586#comment-44396</guid>
		<description>Hallo liebe Leute,

die Lösung von Manuel ist die einzige mit der ich vernünftig arbeiten kann.
Const-Varianten haben das Problem dass man sich drum kümmern muss, dass die z.B. bei Methodenparametern auch verwendet werden, um Lesbarkeit zu erhalten. Auch ob der Wertebereich richtig ist kommt erst zur Laufzeit raus.

Statt 

foo(MyEnum::value1) 
kann man eben auch 

foo(1)

oder
foo(&quot;falscher wert&quot;)
schreiben, ohne dass eine schlaue IDE das als falsch anmeckern kann.

Bei der Java4-Variante kann man das mit Type Hinting verhindern.

in

foo(MyEnum $value)

kann ich richtigerweise nur ein MyEnum übergeben, dass ich mit einem der statischen Konstruktoren erzeugt habe.

Daumen hoch! Dass das aus Java 4 stammt wusste ich noch gar nicht...</description>
		<content:encoded><![CDATA[<p>Hallo liebe Leute,</p>
<p>die Lösung von Manuel ist die einzige mit der ich vernünftig arbeiten kann.<br />
Const-Varianten haben das Problem dass man sich drum kümmern muss, dass die z.B. bei Methodenparametern auch verwendet werden, um Lesbarkeit zu erhalten. Auch ob der Wertebereich richtig ist kommt erst zur Laufzeit raus.</p>
<p>Statt </p>
<p>foo(MyEnum::value1)<br />
kann man eben auch </p>
<p>foo(1)</p>
<p>oder<br />
foo(&#8220;falscher wert&#8221;)<br />
schreiben, ohne dass eine schlaue IDE das als falsch anmeckern kann.</p>
<p>Bei der Java4-Variante kann man das mit Type Hinting verhindern.</p>
<p>in</p>
<p>foo(MyEnum $value)</p>
<p>kann ich richtigerweise nur ein MyEnum übergeben, dass ich mit einem der statischen Konstruktoren erzeugt habe.</p>
<p>Daumen hoch! Dass das aus Java 4 stammt wusste ich noch gar nicht&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Manuel Grundner</title>
		<link>https://blog.ebene7.com/2010/10/08/enums-in-php-sicher-ist-sicher/comment-page-1/#comment-1052</link>
		<dc:creator>Manuel Grundner</dc:creator>
		<pubDate>Mon, 11 Oct 2010 01:16:03 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ebene7.com/?p=1586#comment-1052</guid>
		<description>@Daniel prinzipiell ja, es wird bei jedem aufruf ein neues objekt erzeugt, und somit kann ich mit dem objekt auch machen worauf ich immer lust habe (serialisieren, zerstören, usw). 
Die Klassenabhängigkeit hast du bei Enumerationen im normalfall immer, auch bei nativen Enums.

Nachteilig ist das sich die &quot;werte&quot; nicht gegen ein interface binden können, weil statische methoden durch ein interface nicht deklarierbar sind.

Den Overhead beim Erzeugen des Objekts lasse ich mal außen vor.


Hach, native Enums wären halt schon was schönes in PHP, inklusive returntype-hinting und (was vermutlich niemals kommt) typehinting für native datentypen.</description>
		<content:encoded><![CDATA[<p>@Daniel prinzipiell ja, es wird bei jedem aufruf ein neues objekt erzeugt, und somit kann ich mit dem objekt auch machen worauf ich immer lust habe (serialisieren, zerstören, usw).<br />
Die Klassenabhängigkeit hast du bei Enumerationen im normalfall immer, auch bei nativen Enums.</p>
<p>Nachteilig ist das sich die &#8220;werte&#8221; nicht gegen ein interface binden können, weil statische methoden durch ein interface nicht deklarierbar sind.</p>
<p>Den Overhead beim Erzeugen des Objekts lasse ich mal außen vor.</p>
<p>Hach, native Enums wären halt schon was schönes in PHP, inklusive returntype-hinting und (was vermutlich niemals kommt) typehinting für native datentypen.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Fabian</title>
		<link>https://blog.ebene7.com/2010/10/08/enums-in-php-sicher-ist-sicher/comment-page-1/#comment-1046</link>
		<dc:creator>Fabian</dc:creator>
		<pubDate>Sat, 09 Oct 2010 16:02:53 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ebene7.com/?p=1586#comment-1046</guid>
		<description>@Daniel: jetzt verstehe ich das missverständnis. Den wert speicher ich natürlich nicht in einer statischen variable, es gibt lediglich einen instanz-pool so dass für jeden wert nur ein objekt existiert, UserStatus::ACTIVE() also eine eindeutige instanz zurückgibt. Mir fällt kein anwendungsfall ein, wo dieses verhalten unpassend wäre, es entspricht übigens auch dem typesafe enum-pattern aus java bevor es dort den nativen enum-typ gab.</description>
		<content:encoded><![CDATA[<p>@Daniel: jetzt verstehe ich das missverständnis. Den wert speicher ich natürlich nicht in einer statischen variable, es gibt lediglich einen instanz-pool so dass für jeden wert nur ein objekt existiert, UserStatus::ACTIVE() also eine eindeutige instanz zurückgibt. Mir fällt kein anwendungsfall ein, wo dieses verhalten unpassend wäre, es entspricht übigens auch dem typesafe enum-pattern aus java bevor es dort den nativen enum-typ gab.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Daniel</title>
		<link>https://blog.ebene7.com/2010/10/08/enums-in-php-sicher-ist-sicher/comment-page-1/#comment-1045</link>
		<dc:creator>Daniel</dc:creator>
		<pubDate>Sat, 09 Oct 2010 10:34:32 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ebene7.com/?p=1586#comment-1045</guid>
		<description>@Fabian: Es könnte/wird zu Problemen kommen, wenn der Wert in statischen Klassenvariablen gespeichert wird und man z.B. mehreren Benutzern unterschiedliche Status zuweisen will.

In Manuels Beispiel erzeugt der Methodenaufruf jedesmal ein neues Objekt und man könnte unterschiedliche Werte an verschiedenen Stellen verwenden. Meintest du das so?

Was aber immer bleibt, ist die Klassenabhängigkeit durch den statischen Aufruf.</description>
		<content:encoded><![CDATA[<p>@Fabian: Es könnte/wird zu Problemen kommen, wenn der Wert in statischen Klassenvariablen gespeichert wird und man z.B. mehreren Benutzern unterschiedliche Status zuweisen will.</p>
<p>In Manuels Beispiel erzeugt der Methodenaufruf jedesmal ein neues Objekt und man könnte unterschiedliche Werte an verschiedenen Stellen verwenden. Meintest du das so?</p>
<p>Was aber immer bleibt, ist die Klassenabhängigkeit durch den statischen Aufruf.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Manuel Grundner</title>
		<link>https://blog.ebene7.com/2010/10/08/enums-in-php-sicher-ist-sicher/comment-page-1/#comment-1044</link>
		<dc:creator>Manuel Grundner</dc:creator>
		<pubDate>Sat, 09 Oct 2010 07:38:30 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ebene7.com/?p=1586#comment-1044</guid>
		<description>Ich persönlich verwende die aus java 4 (ich glaube ab 5 hatten sie dann selbst schon enums) variante:

final class MyEnum
{
private $value;
private function __construct($value)
{
$this-&gt;value = $value;
}

public static function value1()
{
return new self(__METHOD__);
}

public static function value2()
{
return new self(__METHOD__);
}

public function getValue()
{
return $value;
}
public function __toString()
{
return (string) $value;
}
}

die kann man dann sogar in einem switch case typsicher verwenden:

$value = MyEnum::value1();

switch($value)
{
case MyEnum::value1():
  echo &#039;Enum rocks&#039;;
  break;
case MyEnum::value2():
  echo &#039;Enum2 rocks!&#039;;
  break;
}

oder mit method typehints.

class MyClass
{
public function __construct(MyEnum $enum)
{

}
}


lg Manuel

Ps.: mit etwas mehraufwand kann man die dinger sogar iterierbar machen ;)</description>
		<content:encoded><![CDATA[<p>Ich persönlich verwende die aus java 4 (ich glaube ab 5 hatten sie dann selbst schon enums) variante:</p>
<p>final class MyEnum<br />
{<br />
private $value;<br />
private function __construct($value)<br />
{<br />
$this-&gt;value = $value;<br />
}</p>
<p>public static function value1()<br />
{<br />
return new self(__METHOD__);<br />
}</p>
<p>public static function value2()<br />
{<br />
return new self(__METHOD__);<br />
}</p>
<p>public function getValue()<br />
{<br />
return $value;<br />
}<br />
public function __toString()<br />
{<br />
return (string) $value;<br />
}<br />
}</p>
<p>die kann man dann sogar in einem switch case typsicher verwenden:</p>
<p>$value = MyEnum::value1();</p>
<p>switch($value)<br />
{<br />
case MyEnum::value1():<br />
  echo &#8216;Enum rocks&#8217;;<br />
  break;<br />
case MyEnum::value2():<br />
  echo &#8216;Enum2 rocks!&#8217;;<br />
  break;<br />
}</p>
<p>oder mit method typehints.</p>
<p>class MyClass<br />
{<br />
public function __construct(MyEnum $enum)<br />
{</p>
<p>}<br />
}</p>
<p>lg Manuel</p>
<p>Ps.: mit etwas mehraufwand kann man die dinger sogar iterierbar machen <img src='https://blog.ebene7.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Fabian</title>
		<link>https://blog.ebene7.com/2010/10/08/enums-in-php-sicher-ist-sicher/comment-page-1/#comment-1041</link>
		<dc:creator>Fabian</dc:creator>
		<pubDate>Fri, 08 Oct 2010 21:29:06 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ebene7.com/?p=1586#comment-1041</guid>
		<description>Ùnd wie würdest du das realisieren? Ob Du dich mit &lt;code&gt;new UserStatus() &lt;/code&gt; oder &lt;code&gt;UserStatus::ACTIVE()&lt;/code&gt; an die Status-Klasse bindest macht doch keinen Unterschied.
Vielleicht verstehe ich auch einfach nicht, was du mit verschiedenen Stati an verschiedenen Stellen meinst. Ich finde, eine Enum-Klasse sollte eindeutig sein, auch wenn Vererbung theoretisch möglich ist, was wiederum mit beiden Lösungen realisierbar ist.</description>
		<content:encoded><![CDATA[<p>Ùnd wie würdest du das realisieren? Ob Du dich mit <code>new UserStatus() </code> oder <code>UserStatus::ACTIVE()</code> an die Status-Klasse bindest macht doch keinen Unterschied.<br />
Vielleicht verstehe ich auch einfach nicht, was du mit verschiedenen Stati an verschiedenen Stellen meinst. Ich finde, eine Enum-Klasse sollte eindeutig sein, auch wenn Vererbung theoretisch möglich ist, was wiederum mit beiden Lösungen realisierbar ist.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
