Klassen Enum

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

T-sneak

Mitglied
10 Mai 2005
623
4
18
28
Rosenheim
jonato.de
Hi Leute,
weis jemand ob es in PHP6 zufällig nun endlich Enumerations wie in anderen Programmiersprachen gibt? Hab in google nur Lösungen über abstrakte Klassen gefunden. Allerdings finde ich diesen Lösungsweg ziemlich dämlich wenn ich jede klasse von der Enum Klasse erben lassen muss..
Hätte das gerne ohne Verbung.

Die Abstrake Lösung wäre ja das hier:
PHP:
class Enum {
    protected $self = array();
    public function __construct( /*...*/ ) {
        $args = func_get_args();
        for( $i=0, $n=count($args); $i<$n; $i++ )
            $this->add($args[$i]);
    }
   
    public function __get( /*string*/ $name = null ) {
        return $this->self[$name];
    }
   
    public function add( /*string*/ $name = null, /*int*/ $enum = null ) {
        if( isset($enum) )
            $this->self[$name] = $enum;
        else
            $this->self[$name] = end($this->self) + 1;
    }
}

Gruß
 

crash

Neues Mitglied
17 August 2008
2.242
25
0
www.lubyte.de
Ich sehe nicht, wo diese Klasse abstrakt ist? Mit ArrayAccress und Iterator kannst du das fast wie einen eigenen Datentyp verwenden.

PHP6 jedenfalls wird's erstmal nicht geben.
 

T-sneak

Mitglied
10 Mai 2005
623
4
18
28
Rosenheim
jonato.de
ja die is jetzt nicht abstract aber sie wird an alle anderen klassen vererbt also bringts nicht so recht viel wenn man sie so nutzt

weil einfach so erreich ich das nicht das ich wenn ich

class system{}

habe das ich

per
$system = new system();
$system->ROT
$system->BLAU

die ENUMs ansprechen kann des geht nur wenn ich bei jeder klasse
class system extends enum
habe
 

crash

Neues Mitglied
17 August 2008
2.242
25
0
www.lubyte.de
Das sind doch vom Prinzip nur Getter und Setter. Ich sehe nicht, warum du sowas nicht entweder pro Klasse neu implementierst, bzw. einfach vererbst. Was spricht denn gegen Vererbung?
 

T-sneak

Mitglied
10 Mai 2005
623
4
18
28
Rosenheim
jonato.de
weil ich schon eine andere Klasse vererbe und man ja keine Mehrfachverbung erstellen kann oder doch?
und die Klasse die ich erbe implementiert ein Interface so wie ziemlich alle System Klassen in meinem CMS..
 

crash

Neues Mitglied
17 August 2008
2.242
25
0
www.lubyte.de
Es gibt leider keine Mehrfachvererbung in PHP. Du wirst also Getter und Setter für jede Klasse neu implementieren müssen. Das ist der übliche Weg, denn ich auf gehe.
 

mermshaus

Senior HTML'ler
11 August 2009
5.369
38
48
www.ermshaus.org
Also, bislang könnte das auch das hier sein:

PHP:
class Test
{
    const ROT  = 0x01;
    const BLAU = 0x02;
}

echo Test::BLAU;

Etwas mehr Kontext?
 

Slibbo

Senior HTML'ler
17 Dezember 2005
1.735
41
48
Warum will man die einträge von Enum überhaupt ansprechen?

PHP:
class Enum() {
    protected $aWhitelist;
    protected $mValue;

    public function __construct() {
        $aWhitelist = func_get_args();
    }

    public function set($mValue) {
        if(!in_array($mValue, $this->aWhitelist)) {
            throw new EnumException(/* füllen | nebenbei irgendwie n ploeder name :-D */);
        }

        $this->mValue = $mValue;
    }

    public function get() {
        return $this->mValue;
    }

    public function __toString() {
        return $this->mValue;
    }
}

das sieht für mich viel mehr nach Enum aus als alles von euch ^^
 

T-sneak

Mitglied
10 Mai 2005
623
4
18
28
Rosenheim
jonato.de
Hmm ja also mermshaus seine Lösung mit den Konstanten passt mir eigentlich am besten..
@Slibbo ich will die ja gar nicht überschreiben ich möchte die einmal festlegen, sodass der User wenn er in meinem CMS iwelche Funktionen hinzufügen will schon "fertige" Parameter hat so wie es Sie auch in anderen Sprachen gibt.. Hätte ich eigentlich selbst auch drauf kommen können mit den Konstanten :-) aber trotzdem danke..
 

crash

Neues Mitglied
17 August 2008
2.242
25
0
www.lubyte.de
Du musst deine Design-Prinzipien irgendwie dokumentieren. Überprüfen könntest du sie sogar mit der Refelctions-API.
 

Slibbo

Senior HTML'ler
17 Dezember 2005
1.735
41
48
Dann machst du den Entwicklern das Leben aber etwas schwerer wenn ich dich richtig verstehe.
Wie wäre es wenn du das gesamte Problem ein wenig genauer beschreibst. Vielleicht habe ich ja eine noch bessere Lösung für dich. :>
 
Werbung: