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

?
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
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

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

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 
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

merci beaucoup
je vais essayer ce splenum

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

merci beaucoup
je vais essayer ce splenum

c'est un extension pecl a installer, ton code suffis

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

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
en haut à droite de la réponse qui te semble la plus pertinente.