72c5cd93b8c40782195d16524b9de5c69107e6e1
[mtweb] / web / libs / empty_class.php
1 <?php
2
3 /*
4
5   Cette classe aide a agreger des classes qui en heritent
6
7   une classe qui herite de empty_class peut etre vide
8   (sans attribut ni methode). une fois instanciee,
9   la fonction load_modules lui ajoute les methodes
10   qui sont definies dans d'autres classes qui heritent
11   aussi de empty_class
12
13   NOTE: pour la compatibilite php4 et php5,
14   le mecanisme d'agregation est different selon
15   la version de php
16
17   php4: c'est la methode aggregate qui est utilisee
18
19   php5: les classes contenant les nouvelles methodes
20         sont instanciees et sont enregistrĂ©es dans
21         le tableau associatif $module
22
23   ATTENTION: les attributs de ces classes, en php5,
24              on donc un contexte qui depend de
25              leur classe et ne sont pas accessibles
26              directement via l'instance principale
27
28              si ces attributs doivent etre accessible
29              via l'instance principale, il faut prevoir
30              des accesseurs.
31
32 */
33
34   class empty_class
35   {
36
37     var $root_inst;
38     var $modules;
39
40     function empty_class($root_inst)
41     { if($root_inst === true) $this->root_inst = $this;
42       else $this->root_inst = $root_inst;
43     }
44
45     function load_modules($modules_path, $current_modules, $core_modules = null)
46     { $this->_load_modules($modules_path, $current_modules, $this->root_inst, true);
47       if(isset($core_modules) && $current_modules != $core_modules)
48       { $this->_load_modules($modules_path, $core_modules, $this->root_inst, true);
49       }
50     }
51
52     function _load_modules($modules_path, $modules_path_suffixe, $root_inst, $recursif = false)
53     { if(file_exists($modules_path.$modules_path_suffixe) && $dh = opendir($modules_path.$modules_path_suffixe))
54       { while(($file = readdir($dh)) !== false)
55         { if(is_dir($modules_path.$modules_path_suffixe.$file))
56           { if($recursif && substr($file, 0, 1) != ".")
57             { $this->_load_modules($modules_path, $modules_path_suffixe.$file."/", $root_inst, $recursif);
58             }
59           }
60           elseif(strcasecmp(substr($file, -4), ".php") == 0)
61           { $this->load($modules_path.$modules_path_suffixe.$file, $root_inst);
62           }
63         }
64         closedir($dh);
65       }
66     }
67
68     function load($module_file, $root_inst)
69     { if($module_file && file_exists($module_file))
70       { $v_path = explode("/", $module_file);
71         $file = $v_path[count($v_path) - 1];
72         if(strcasecmp(substr($file, -4), ".php") == 0)
73         { $class_name = substr($file, 0, -4);
74           if(!class_exists($class_name))
75           { require_once $module_file;
76             if(version_compare(PHP_VERSION, '5.0.0', '>='))
77             { if(class_exists($class_name) && !isset($this->modules[$class_name]))
78               { $this->modules[$class_name] = new $class_name($root_inst);
79               }
80             }
81             else
82             { if(class_exists($class_name))
83               { aggregate($this, $class_name);
84               }
85             }
86           }
87         }
88       }
89     }
90
91     function __call($method_name, $arguments)
92     { return $this->empty_class_call($this->root_inst, $method_name, $arguments);
93     }
94
95     function empty_class_call($inst, $method_name, $arguments)
96     { $r = false;
97       $args = "";
98       foreach($arguments as $i => $arg) $args .= ($args ? ", " : "")."\$arguments[".$i."]";
99       if(isset($inst->modules)) foreach($inst->modules as $module_name => $module)
100       { if(method_exists($module, $method_name))
101         { eval("\$r = \$module->".$method_name."(".$args.");");
102           break;
103         }
104         else
105         { $r = $this->empty_class_call($module, $method_name, $arguments);
106           if($r !== false) break;
107         }
108       }
109       return $r;
110     }
111
112   }
113
114 ?>