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 -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php