En fait, actuellement, j'utilise une classe de base dynamique.
Code PHP :
<?php
class Dynamic {
function __call($func, $args) {
$func = strtolower($func);
if(!isset($this -> funcs[$func])){
echo 'Action Impossible : "'.$func.'" pour '.$this->get_Name().'<br />';
return false;
}
$assoc = $this -> funcs[$func];
if (is_object($assoc))
return call_user_func_array(array($assoc,$func), $args);
if (!isset($assoc)) $assoc = get_class($this);
$argarr = array();
$keys = array_keys($args);
foreach ($keys as $id => $key)
$argarr[] = '$args[$keys['.$id.']]';
$argstr = implode($argarr, ",");
return eval("return $assoc::$func($argstr);");
}
function import($arg1, $arg2=null) {
assert (is_object($arg1) || class_exists($arg1));
if (isset($arg2))
$this -> funcs[strtolower($arg2)] = $arg1;
else
foreach (get_class_methods($arg1) as $method)
$this -> funcs[strtolower($method)] = $arg1;
}
}
J'ai trouvé la base de ce code sur un article parlant de méthodes dynamiques avec les objets en PHP. La class Dynamic permet donc d'importer les méthodes d'une autre classe (soit toutes les méthodes ou une méthode spécifique)
La classe Unité est une extension de cette classe de base. Elle contient une méthode Load_Specs, invoquée au chargement. Les méthodes "externes" sont importées en fonction du nom de la capacité spéciale.
Code PHP :
<?php
Class troop extends Dynamic {
...
function load_Specs($aSpecs){
foreach($aSpecs as $Spec){
// Inclusion du fichier externe correspondant à la méthode
require_once 'specs/'.$Spec.'.method.inc';
// Import de toutes les méthodes de la classe dans la classe Unité
$this->import($Spec.'_method');
}
}
}