Comme tu l'as toi-même vu dans tes recherches, c'est le design pattern "Factory" qui résoudra ton problème.
Un objet est d'une classe, s'il change de classe alors c'est un autre objet.
On ne trouve de "mutation" dans aucun des langages que je connais, donc je ne pense pas que ce soit quelque chose auquel tu doives te raccrocher
Si tu veux faire un objet dynamique, je te propose d'utiliser un wrapper :
Un objet est d'une classe, s'il change de classe alors c'est un autre objet.
On ne trouve de "mutation" dans aucun des langages que je connais, donc je ne pense pas que ce soit quelque chose auquel tu doives te raccrocher
Si tu veux faire un objet dynamique, je te propose d'utiliser un wrapper :
Code PHP :
<?php
class Wrapper
{
protected $wrapped;
public function getClass()
{
return get_class($this->wrapped);
}
public function isA($className)
{
return is_a($this->wrapped, $className);
}
public function __call($foo, $args)
{
return call_user_func_array(array($this->wrapped, $foo), $args);
}
public function __get($var)
{
return $this->wrapped->$var;
}
public function __set($var, $val)
{
$this->wrapped->$var = $val;
}
}
class GenericMember extends Wrapper
{
public function __construct($login, $password)
{
$info = self::getInfos($login, $password);
if (!$info) {
$this->wrapped = new Guest;
} else {
switch ($info['permission']) {
case 'admin': $this->wrapped = new Administrator($info); break;
case 'moderator': $this->wrapped = new Moderator($info); break;
default: $this->wrapped = new SimpleMember($info); break;
}
}
}
}
Avec un truc comme ça, tu as ton constructeur générique :
Code PHP :
<?php
$member = new GenericMember($login, $password); // cas d'un admin
echo $member->getClass(); // "Administrator"
$member->kick($username); // il a le droit, il est administrateur :)