Модули - помогите, plz...

ilkz

Новичок
Модули - помогите, plz...

Всем драсть!

Взялся писать механизм работы с модулями для совего движка.
Вот код:
PHP:
<?
$config_file='confog.php';
require_once($config_file);

//=================================
function LoadModules($Modules_Dir)
{
  $Modules_Dir=trim($Modules_Dir);
  chdir($Modules_Dir);
  $d=@opendir('.');
  if(!$d) return false;
  while(($e=='.'||$e=='..') continue;
  require_once(trim($e));
  if(function_exists('StartModule'))
  {
    unregister_tick_function('StartModule');
    echo "<b>$e</b> is a module";
  }
  else{echo "<b>$e</b> is not a module";}
  chdir('..');
  return true;
}

//===================================
if(LoadModules($ModDir)){}
else{echo "<b>ERROR:</b>could not load modules";}
?>
Суть его работы такова. Скрипт лезет в папку $ModDir, в которой хранятся файлы модулей. Далее он подключает каждый файл из этой диры и ищет в нем функцию StartModule. Если в файле такая функция есть, то этот файл считается модулем, если такой функции нет - это не модуль.

При работе этого скрипта апач напрочь падает сначала с ошибкой, а потом с ошибкой переполнения буфера. Глюк - здесь: unregister_tick_function('StartModule');
Я просто неправильно использую эту функцию. НО. Даже если ее убрать - скрипт не работает.

А вот в чем суть его неработы: если ПЕРВЫЙ файл из списка - модуль (в нем есть ф-я StartModule), то ВСЕ ПОСЛЕДУЮЩИЕ тоже он считает модулями. Насколько я понял, происходит это из-за того, что, найдя в первом файле нужную функцию, ПХП сохраняет ее имя где-то у себя в памяти. Тогда, после инклуда следующего файла ПХП ВСЕ РАВНО найдет там стартовую ф-ю (StartModule) - ведь она уже в памяти... Таким образом получается, что все файлы - модули :)))).

Теперь об устранении сего глюка - очевидно, что надо после каждой проверки на ф-ю StartModule удалять из памяти ПХП ее имя. Тогда про инклуде следующего файла алгоритм будет работать.

Но вот незадача - я не знаю, можно ли это сделать, и если можно, то как...

Если все понятно и есть какие-то мысли - помогите, плз... Буду очень признателен.

Заранее всем спасибо!

-~{}~ 24.01.05 13:40:

хы, жаль, что ПХП Ассемблер не поддерживает :))) А то бы все решилось довольно просто :)))))))))
 

Gas

может по одной?
Имя ф-ции должно быть уникальным.
PHP does not support function overloading, nor is it possible to undefine or redefine previously-declared functions.
И в php нет namespace'ов, так что ищи другое решение.
 

ilkz

Новичок
Спасибо. Понял. Но если имя функции - уникально, как скрипт поймет, что это именно функция определяющая модуль? А если там будет не одна ф-я (а там будет не одна ф-я :) ??
 

Gas

может по одной?
Можно сделать каждый модуль в виде класса, но у тебя должны быть соответствующие знания в этой области.
Да хоть массив заведи со списком модулей
или придумай правило формирования имени start ф-ции. Например, filename.Start();
 

ilkz

Новичок
Не, писать модульность на ООП не буду - слишком круто :)
А вот насчет второго предложения - интересно, надо будет поковырять...
 

Screjet

Новичок
Встречный вопрос:
как лучше?
PHP:
// mod1.php
function mod1_start(){
}
//
function mod1_init(){
}
//
function mod1_free(){
}
или
PHP:
class mod1 {
  function start(){
  }
//
  function init(){
  }
//
  function free(){
  }
}
 
Сверху