Enum java-like typage fort

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 968 fois - Téléchargée 19 fois

Contenu du snippet

Comment faire un enum en php ?

http://fr.php.net/manual/en/language.oop5.php#73929
ici on pouvait trouver une solution qui semblait correcte et simple, mais le typage de cette solution semble gennant pour faire des fonctions comme :

public function JourDeLaSemaine_Is_WeekEnd(Day $jour)

on doit alors avoir un element de l'enum qui a un "instanceOf" correct !

ici, vous avez un enum java-like c'est a dire que :
un enum est un nouveau type a part entiere
un enum est un objet, il peut contenir d'autres fonctions
on ne peut pas "construire" un enum.

Source / Exemple :


<?php
error_reporting(E_ALL);

class EnumException extends Exception{}

class Enum{
	public function __construct(){
		$array=func_get_args();
		$this->className=$className=$array[0];
		$contentClass=$array[1];
		$this->element=array();
		$count=count($array);
		eval('
			class '.$className.' extends Enum {
				public function __construct($i=0, $string=\'\'){
					if (self::$nbr>='.$count.'){
						throw new EnumException(\'On ne peut declarer un nouvel element dans un enum !\');
					}
					$this->content=$i;
					$this->toString=$string;
					self::$nbr++;
				}
				public function __toString(){
					return $this->toString;
				}
				'.$contentClass.'
				private $content;
				private static $nbr=2;
				private $toString;
			}
		');
		for ($i=2;$i<$count;$i++){
			$this->element[$i]=new $className($i-2, $array[$i]);
			$this->$array[$i]=&$this->element[$i];
		}
	}
	private $element;
}

$a=new Enum('enumTest', 'public function aboyer(){ echo \'test\'; } ', 'black', 'white', 'green');

echo $a->black;
echo '<hr />';
echo $a->white;
echo '<hr />';

$a->white->aboyer();

if ($a->white instanceOf enumTest){
	echo 'instance';
}

$b=new EnumTest();

?>

Conclusion :


ici, l'exception est lancee histoire de montrer qu'on ne peut pas lancer l'enum.

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
lundi 3 novembre 2008
Statut
Membre
Dernière intervention
5 novembre 2008

Salut

Aïe aïe aïe ...
Un 'eval' ...

J'ai posté un code répondant à ton pb :
http://www.phpcs.com/tutoriaux/ENUMERATIONS-ENUM-PHP_798.aspx
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
15
quelques remarques sur ce code ici... : http://www.phpcs.com/tutorial.aspx?ID=798#comm4144
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
41
new Enum('enumTest', 'public function aboyer(){ echo \'test\'; } ', 'black', 'white', 'green');

j'allais oublier, ca prend comme arguments :

1 -> le nouveau type
2 -> les fonctions a ajouter
3 -> le premier element de l'enum
4 -> le second
etc...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.