Одно время приходилось "ковыряться" во внутренностях системы eGroupWare (http://www.egroupware.org/).
Кое-что взял оттуда на вооружение, но многое видоизменилось в процессе использования, поэтому пример приведу из первоисточника. Если кто заинтерессуется может скачать архив дистрибутива (около 38Мб), в котором около 40 000 файлов (очень долго распаковывается и копируется :)) и посмотреть что там и как.
В коде классов этой системы создают и подключают на лету сколько угодно различных классов. Получаются что-то типа "класс наследник нескольких классов" (Вот это может и приходиться в интерессующей задаче).
Код имеет вид:
......
$this->so = CreateObject(\'addressbook.soaddressbook\');
....
$ret = $this->so->contacts->check_perms(False,$rights,$addr);
....
В первой строчке создается и подключается "на лету" класс
../addressbook/inc/class.soaddressbook.inc.php.
Во второй строчке, в подключаемом классе в свою очеред подключили еще один класс, но используют все их методы в основном классе.
Код функции создания и подключения класса "на лету":
function &CreateObject($class)
{
list($appname,$classname) = explode(\'.\',$class);
include_once($file=EGW_INCLUDE_ROOT.\'/\'.$appname.\'/inc/class.\'.$classname.\'.inc.php\');
if (class_exists($classname))
{
$args = func_get_args();
if(count($args) == 1)
{
$obj =& new $classname;
}
else
{
$code = \'$obj =& new \' . $classname . \'(\';
foreach($args as $n => $arg)
{
if ($n)
{
$code .= ($n > 1 ? \',\' : \'\') . \'$args[\' . $n . \']\';
}
}
$code .= \');\';
eval($code);
}
}
if (!is_object($obj))
{
echo "CreateObject(\'$class\'): Cant instanciate class!!!
\\n".function_backtrace(1)."
\\n";
}
return $obj;
}
Для передачи данных между различными классами используется массив $GLOBALS. (Этот массив может быть лучше и использовать вместо MySQL).