|
Posted by Tom Rogers on 06/26/05 05:33
Hi,
Sunday, June 26, 2005, 12:27:44 PM, you wrote:
TR> Hi,
TR> Here it is for anyone that would like to try it.
TR> <?php
TR> if(preg_match('/^win/i',PHP_OS)){
TR> define('OS_SEP','\\');
TR> define('OS_JOIN',';');
TR> }else{
TR> define('OS_SEP','/');
TR> define('OS_JOIN',':');
TR> }
TR> class classLoader {
TR> function loadLib($library=''){
TR> if(!empty($library)){
TR> $file = $GLOBALS['class_dir'].$library.'.lib';
TR> if(!file_exists($file)){
TR> $paths = split(OS_JOIN,ini_get('include_path'));
TR> $found = false;
TR> while(!$found && list($key,$val) = each($paths)){
TR> $file = $val.OS_SEP.$library.'.lib';
TR> $found = file_exists($file);
TR> }
TR> }
TR> if($found) include($file);
TR> }
TR> $array = get_declared_classes();
TR> foreach($array as $classname){
TR> if(!isset($GLOBALS['loaded_classes'][$classname]))
TR> $GLOBALS['loaded_classes'][$classname] = array();
TR> }
TR> if(isset($start_classes) && is_array($start_classes)){
TR> foreach($start_classes as $class=>$info){
TR> $class_name = strtolower($class);
TR> $name = $info['name'];
TR> $hash = mhash(MHASH_TIGER,serialize($info['vars']));
TR> if(isset($GLOBALS['loaded_classes'][$class_name])){
TR> $varcount = count($info['vars']);
TR> $vars =
TR> '$GLOBALS[\'loaded_classes\'][$class_name][$name][\'class\'] =&
TR> new '.$class.'(';
TR> if($varcount > 0){
TR> for ($i = 0; $i < $varcount; $i++) {
TR> $vars .= ($i > 0)? ',':'';
TR> $varname = 'variable'.$i;
TR> $$varname = $info['vars'][$i];
TR> $vars .= "\$$varname";
TR> }
TR> }
TR> $vars .= ');';
TR> eval($vars);
TR>
TR> $GLOBALS['loaded_classes'][$class_name][$name]['hash'] = $hash;
TR> if(!empty($info['global']))
TR> $GLOBALS[$info['global']] =&
TR> $GLOBALS['loaded_classes'][$class_name][$name]['class'];
TR> }
TR> }
TR> unset($start_classes);
TR> }
TR> }
TR> function &load($class,$name=''){
TR> $class_name = strtolower($class);
TR> $name = (empty($name))? $class:$name;
TR> $num_args = func_num_args();
TR> $arg_list = func_get_args();
TR> $hash = mhash(MHASH_TIGER,serialize($arg_list));
TR> if(isset($GLOBALS['loaded_classes'][$class_name][$name])){
TR> if($num_args > 2 &&
TR> $GLOBALS['loaded_classes'][$class_name][$name]['hash'] != $hash){
TR> $vars =
TR> '$GLOBALS[\'loaded_classes\'][$class_name][$name][\'class\']->'.$class.'(';
TR> for ($i = 2; $i < $num_args; $i++) {
TR> $vars .= ($i > 2)? ',':'';
TR> $varname = 'variable'.$i;
TR> $$varname =& $arg_list[$i];
TR> $vars .= "\$$varname";
TR> }
TR> $vars .= ');';
TR> eval($vars);
TR>
TR> $GLOBALS['loaded_classes'][$class_name][$name]['hash'] = $hash;
TR> }
TR> return
TR> $GLOBALS['loaded_classes'][$class_name][$name]['class'];
TR> }elseif(!isset($GLOBALS['loaded_classes'][$class_name])){
TR> $file = $GLOBALS['class_dir'].$class.'.inc';
TR> if(!file_exists($file)){
TR> $paths = split(OS_JOIN,ini_get('include_path'));
TR> $found = false;
TR> while(!$found && list($key,$val) = each($paths)){
TR> $file = $val.OS_SEP.$class.'.inc';
TR> $found = file_exists($file);
TR> }
TR> }else $found = true;
TR> if($found){
TR> include($file);
TR> classLoader::loadLib();
TR> }
TR> }
TR> if(isset($GLOBALS['loaded_classes'][$class_name])){
TR> $vars =
TR> '$GLOBALS[\'loaded_classes\'][$class_name][$name][\'class\'] =&
TR> new '.$class.'(';
TR> if($num_args > 2) {
TR> for ($i = 2; $i < $num_args; $i++) {
TR> $vars .= ($i > 2)? ',':'';
TR> $varname = 'variable'.$i;
TR> $$varname =& $arg_list[$i];
TR> $vars .= "\$$varname";
TR> }
TR> }
TR> $vars .= ');';
TR> eval($vars);
TR> $GLOBALS['loaded_classes'][$class_name][$name]['hash'] = $hash;
TR> return
TR> $GLOBALS['loaded_classes'][$class_name][$name]['class'];
TR> }
TR> return false;
TR> }
TR> function remove($class,$name=''){
TR> $r = false;
TR> $class_name = strtolower($class);
TR> $name = (empty($name))? $class:$name;
TR> if(isset($GLOBALS['loaded_classes'][$class_name][$name])){
TR> unset($GLOBALS['loaded_classes'][$class_name][$name]);
TR> $r = true;
TR> }
TR> return $r;
TR> }
TR> function &find($class,$name){
TR> $class_name = strtolower($class);
TR> if(isset($GLOBALS['loaded_classes'][$class_name][$name])){
TR> return
TR> $GLOBALS['loaded_classes'][$class_name][$name]['class'];
TR> }else{
TR> return false;
TR> }
TR> }
TR> }
TR> //Usage
TR> // not tested in php5
TR> // all class files end in .inc
TR> // all library files end in .lib
TR> // I don't instanciate the class so uou just
TR> // need to set 2 global variables them call loadLib()
TR> // without any args to get a list of already loaded classes.
TR> $class_dir = '/usr/local/apache/phpinc';
TR> $loaded_classes = array();
TR> classLoader::loadLib();
TR> // The load a class giving it a name and any args that it needs,
TR> // it can pass references without problem
TR> // for example I have a Mysql table class I use just about everywhere
TR> // which needs the db and table to use
TR> $table =&
TR> classLoader::load('tableClass','members','testdb','test_table');
TR> // now I can get that same instance by 2 methods
TR> // simply repeat the line with the same instance name or
TR> // use the find() method if I know it already exists.
TR> $table2 =& classLoaderFind('tableClass','members');
TR> //if you need a seperate instance of a class give it a new name
TR> $table3 =&
TR> classLoader::load('tableClass','members2','testdb','test_table');
TR> //You can use loadLib() to setup a bunch of base classes that are always needed
TR> classLoader::loadLib('base');
TR> //Al this works inside class definitions as well.
TR> class a {
TR> var $table;
TR> function a(){
TR> $this->table =&
TR> classLoader::load('tableClass','members','testdb','test_table');
TR> }
TR> }
TR> --
TR> regards,
TR> Tom
should do this when fully awake..
that should be
$table2 =& classLoader::find('tableClass','members');
--
regards,
Tom
Navigation:
[Reply to this message]
|