You are here: Re[2]: [PHP] Best way to use other objects within classes? « PHP « IT news, forums, messages
Re[2]: [PHP] Best way to use other objects within classes?

Posted by Tom Rogers on 06/26/05 05:27

Hi,

Here it is for anyone that would like to try it.


<?php

if(preg_match('/^win/i',PHP_OS)){
define('OS_SEP','\\');
define('OS_JOIN',';');
}else{
define('OS_SEP','/');
define('OS_JOIN',':');
}
class classLoader {
function loadLib($library=''){
if(!empty($library)){
$file = $GLOBALS['class_dir'].$library.'.lib';
if(!file_exists($file)){
$paths = split(OS_JOIN,ini_get('include_path'));
$found = false;
while(!$found && list($key,$val) = each($paths)){
$file = $val.OS_SEP.$library.'.lib';
$found = file_exists($file);
}
}
if($found) include($file);
}
$array = get_declared_classes();
foreach($array as $classname){
if(!isset($GLOBALS['loaded_classes'][$classname])) $GLOBALS['loaded_classes'][$classname] = array();
}
if(isset($start_classes) && is_array($start_classes)){
foreach($start_classes as $class=>$info){
$class_name = strtolower($class);
$name = $info['name'];
$hash = mhash(MHASH_TIGER,serialize($info['vars']));
if(isset($GLOBALS['loaded_classes'][$class_name])){
$varcount = count($info['vars']);
$vars = '$GLOBALS[\'loaded_classes\'][$class_name][$name][\'class\'] =& new '.$class.'(';
if($varcount > 0){
for ($i = 0; $i < $varcount; $i++) {
$vars .= ($i > 0)? ',':'';
$varname = 'variable'.$i;
$$varname = $info['vars'][$i];
$vars .= "\$$varname";
}
}
$vars .= ');';
eval($vars);
$GLOBALS['loaded_classes'][$class_name][$name]['hash'] = $hash;
if(!empty($info['global'])) $GLOBALS[$info['global']] =& $GLOBALS['loaded_classes'][$class_name][$name]['class'];
}
}
unset($start_classes);
}
}
function &load($class,$name=''){
$class_name = strtolower($class);
$name = (empty($name))? $class:$name;
$num_args = func_num_args();
$arg_list = func_get_args();
$hash = mhash(MHASH_TIGER,serialize($arg_list));
if(isset($GLOBALS['loaded_classes'][$class_name][$name])){
if($num_args > 2 && $GLOBALS['loaded_classes'][$class_name][$name]['hash'] != $hash){
$vars = '$GLOBALS[\'loaded_classes\'][$class_name][$name][\'class\']->'.$class.'(';
for ($i = 2; $i < $num_args; $i++) {
$vars .= ($i > 2)? ',':'';
$varname = 'variable'.$i;
$$varname =& $arg_list[$i];
$vars .= "\$$varname";
}
$vars .= ');';
eval($vars);
$GLOBALS['loaded_classes'][$class_name][$name]['hash'] = $hash;
}
return $GLOBALS['loaded_classes'][$class_name][$name]['class'];
}elseif(!isset($GLOBALS['loaded_classes'][$class_name])){
$file = $GLOBALS['class_dir'].$class.'.inc';
if(!file_exists($file)){
$paths = split(OS_JOIN,ini_get('include_path'));
$found = false;
while(!$found && list($key,$val) = each($paths)){
$file = $val.OS_SEP.$class.'.inc';
$found = file_exists($file);
}
}else $found = true;
if($found){
include($file);
classLoader::loadLib();
}
}
if(isset($GLOBALS['loaded_classes'][$class_name])){
$vars = '$GLOBALS[\'loaded_classes\'][$class_name][$name][\'class\'] =& new '.$class.'(';
if($num_args > 2) {
for ($i = 2; $i < $num_args; $i++) {
$vars .= ($i > 2)? ',':'';
$varname = 'variable'.$i;
$$varname =& $arg_list[$i];
$vars .= "\$$varname";
}
}
$vars .= ');';
eval($vars);
$GLOBALS['loaded_classes'][$class_name][$name]['hash'] = $hash;
return $GLOBALS['loaded_classes'][$class_name][$name]['class'];
}
return false;
}
function remove($class,$name=''){
$r = false;
$class_name = strtolower($class);
$name = (empty($name))? $class:$name;
if(isset($GLOBALS['loaded_classes'][$class_name][$name])){
unset($GLOBALS['loaded_classes'][$class_name][$name]);
$r = true;
}
return $r;
}
function &find($class,$name){
$class_name = strtolower($class);
if(isset($GLOBALS['loaded_classes'][$class_name][$name])){
return $GLOBALS['loaded_classes'][$class_name][$name]['class'];
}else{
return false;
}
}
}
//Usage
// not tested in php5
// all class files end in .inc
// all library files end in .lib
// I don't instanciate the class so uou just
// need to set 2 global variables them call loadLib()
// without any args to get a list of already loaded classes.

$class_dir = '/usr/local/apache/phpinc';
$loaded_classes = array();
classLoader::loadLib();

// The load a class giving it a name and any args that it needs,
// it can pass references without problem
// for example I have a Mysql table class I use just about everywhere
// which needs the db and table to use


$table =& classLoader::load('tableClass','members','testdb','test_table');

// now I can get that same instance by 2 methods
// simply repeat the line with the same instance name or
// use the find() method if I know it already exists.

$table2 =& classLoaderFind('tableClass','members');

//if you need a seperate instance of a class give it a new name

$table3 =& classLoader::load('tableClass','members2','testdb','test_table');

//You can use loadLib() to setup a bunch of base classes that are always needed

classLoader::loadLib('base');

//Al this works inside class definitions as well.

class a {
var $table;
function a(){
$this->table =& classLoader::load('tableClass','members','testdb','test_table');
}
}



--
regards,
Tom

 

Navigation:

[Reply to this message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация