Enum java-like typage fort

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 174 fois - Téléchargée 20 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
FrancoisHill Messages postés 1 Date d'inscription lundi 3 novembre 2008 Statut Membre Dernière intervention 5 novembre 2008
5 nov. 2008 à 15:09
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
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 18
15 janv. 2008 à 15:10
quelques remarques sur ce code ici... : http://www.phpcs.com/tutorial.aspx?ID=798#comm4144
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
14 janv. 2008 à 01:58
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.