Page 1 sur 1

pourquoi ce code marche pas MyEnum implements IteratorAggreg

Posté : 17 juin 2010, 19:45
par jeorcal
Bonjour

quelqu'un peut me dire ce qui fait que ce code ne marche pas ? ... merci
<?php
abstract class MyEnum implements IteratorAggregate
{
    final public function __construct($value)
    {
        $c = new ReflectionClass($this);
        if(!in_array($value, $c->getConstants())) {
            throw IllegalArgumentException();
        }
        $this->value = $value;
    }

    final public function __toString()
    {
        return $this->value;
    }
    
    public function getIterator()
	{
	   $c = new ReflectionClass($this);
	   return new ArrayIterator( $c->getConstants() );
	}
}

class Foo extends MyEnum
{
    const FOO = "foo";
    const BAR = "bar";
    const ITEM = "item";
}

$myEnum = new Foo();
foreach ($myEnum as $k => $v) {
    
    echo $k . ' => ' .  $v . '<br />';
}
?>

Re: pourquoi ce code marche pas MyEnum implements IteratorAggreg

Posté : 18 juin 2010, 02:41
par Genova
C'est quoi l'erreur au juste :roll: ?

Re: pourquoi ce code marche pas MyEnum implements IteratorAggreg

Posté : 18 juin 2010, 02:51
par stealth35
met le niveau d'erreur en E_ALL | E_STRICT et tu comprendra :wink:

ensuite tu ne peux pas parcourir les constantes d'une class, le foreach marche sur les propriétés

Re: pourquoi ce code marche pas MyEnum implements IteratorAggreg

Posté : 18 juin 2010, 07:52
par jeorcal
normalement avec une class qui implémente Iterator on devrait pouvoir parcourir un enum, c'est le cas en C# .net

Je ne comprends pas pourquoi les Enum, vraiment indispensables, n'existent pas en php

merci pour la réponse

Re: pourquoi ce code marche pas MyEnum implements IteratorAggreg

Posté : 18 juin 2010, 14:57
par stealth35
normalement avec une class qui implémente Iterator on devrait pouvoir parcourir un enum, c'est le cas en C# .net

Je ne comprends pas pourquoi les Enum, vraiment indispensables, n'existent pas en php

merci pour la réponse
tu fais un switch :wink:

Re: pourquoi ce code marche pas MyEnum implements IteratorAggreg

Posté : 18 juin 2010, 15:05
par jeorcal
oui mais c'est lourd si tu à 10 constantes avec un loop tu balayes la série en un coup
je peux bien sur créer un array , mais j'aurais aimé une class enum

Re: pourquoi ce code marche pas MyEnum implements IteratorAggreg

Posté : 18 juin 2010, 15:17
par stealth35
oui mais c'est lourd si tu à 10 constantes avec un loop tu balayes la série en un coup
je peux bien sur créer un array , mais j'aurais aimé une class enum
ton code marche mais il pas bon corrige les erreurs :wink:

Re: pourquoi ce code marche pas MyEnum implements IteratorAggreg

Posté : 18 juin 2010, 16:01
par jeorcal
je l'ai posté justement pour que quelqu'un le corrige

Re: pourquoi ce code marche pas MyEnum implements IteratorAggreg

Posté : 18 juin 2010, 16:07
par stealth35
je l'ai posté justement pour que quelqu'un le corrige
erreur 1:
ton __construct attend 1 argument, mais quand tu l'apelles

solution met
__construct($value = null)



erreur 2:
IllegalArgumentException n'existe pas c'est InvalidArgumentException

erreur 3
comme $value n'exsite pas tu aura forcement l'exception

solution
if($value && !in_array($value, $c->getConstants()))

EDIT : je l'avais oublié celui la http://www.php.net/manual/en/class.splenum.php :wink:

Re: pourquoi ce code marche pas MyEnum implements IteratorAggreg

Posté : 18 juin 2010, 16:40
par jeorcal
avec if($value && !in_array($value, $c->getConstants()))

c tout bon :D merci beaucoup

je vais essayer ce splenum :mrgreen:

Re: pourquoi ce code marche pas MyEnum implements IteratorAggreg

Posté : 18 juin 2010, 16:43
par stealth35
avec if($value && !in_array($value, $c->getConstants()))

c tout bon :D merci beaucoup

je vais essayer ce splenum :mrgreen:
c'est un extension pecl a installer, ton code suffis :wink:

Re: pourquoi ce code marche pas MyEnum implements IteratorAggreg

Posté : 18 juin 2010, 16:48
par jeorcal
oui ça marche impec =D>

c'est quand même dommage de se priver d'enums :mrgreen:

Re: pourquoi ce code marche pas MyEnum implements IteratorAggreg

Posté : 18 juin 2010, 16:52
par zeus
Modération :
Si ta question est résolue, pense à l'indiquer pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.
Tu peux réaliser cette opération toi-même en cliquant sur le bouton Image en haut à droite de la réponse qui te semble la plus pertinente.