2010-08-04 1 views
1

Функция автозагрузки Я использую выглядят следующим образом: -PHP - Как быть в состоянии использовать переменные внутри функции __autoload()

function __autoload($moduleName) 
{ 
    //Logic to check file existence- include if exists else redirect to fallback page 
} 

ли не принимать какие-либо другие аргументы? Я хочу выполнить некоторую логику, основанную на некоторых переменных внутри функции автозагрузки. Как мне это сделать без использования глобальных переменных?

Благодаря

Дополнительные детали

Я думаю, что это не возможно, внутри __autoload() класса, но до сих пор пытаются объяснить на примере.

У меня есть файл modules.config, который имеет массив: -

$viewClassMap = array('search_classes' => 'commonClassListings', 
         'search_packs' => 'commonPackListings', 
         ); 

выше массив означает, что класс commonClassListings должен быть включен в случае search_classes просмотра, класс commonPackListings должен быть включен в случае search_packs. Для всех других представлений, по умолчанию, класс commonDisplay будет включен

function __autoload($viewName,$viewClassMap) 
{ 
    if(in_array($viewName,$viewClassMap)) 
    { 
     $viewTobeIncluded = $viewClassMap[$viewName]; 

     include path/to/$viewTobeIncluded; 
    } 
    else 
    { 
     include path/to/commonDisplay; 
    } 
} 

Теперь, я думаю, что логика внутри функции __autoload должна быть выведена, и первым взгляд, загружаемым должно быть вычислено и затем только самозарядной должен быть вызван. Это также и цель автозагрузки (для включения файла класса, объект которого был инициирован).

Обновления

Моя функция автозагрузка не внутри класса представления, объект которой я собираюсь начать во время выполнения (В отличие, например Blizz в). У меня есть общая функция автозагрузки, определенная в файле pageLoader.php, который включен в общий froncontroller. Для каждого модуля, класс представления initatiated как

$view = new search_classes(); 

Тогда общая функция автозагрузки должна проверить соответствующий родительский класс вида (commonClassListings в данном случае) присутствуют или нет, если да, включить его и search_classes посмотреть на себя и пропустить объект, иначе отступить. Для этого мне нужно передать массив $viewClassMap функции автозагрузки. Это возможно?

+0

Я выберу лучший ответ после попытки решения ... –

ответ

3

Единственный способ, о котором я могу думать, - зарегистрировать объект класса как обработчик автозагрузки (с spl_autoload_register). Вы можете зарегистрировать экземпляр в любое время, указав в качестве обратного вызова массив ($ oInstance, "functionName").

Вы можете установить переменные в этом экземпляре класса, прежде чем выполнять операцию, которая приведет к автоматической загрузке.

Редактировать: По вашему запросу небольшой пример того, как это работает. Обратите внимание, что я обычно работаю со статическими методами в классе для автозагрузки, поэтому я не знаю, работает ли он с экземпляром, но я проверил документацию, и он должен. Вы можете просто сделать функцию, а массив статической, если он не работает

class Test 
{ 
    public $viewClassMap = array('search_classes' => 'commonClassListings', 
         'search_packs' => 'commonPackListings', 
         ); 

    public function autoload($viewName) 
    { 
    if (in_array($viewName,$this->viewClassMap)) 
      ... 
    } 
} 

$test = new Test; 
spl_autoload_register(array($test, 'autoload')); 
+0

Привет Blizz, если бы вы могли объяснить это на примере. Я не уверен, что это решает мою проблему. Пожалуйста, ознакомьтесь с разделом дополнительной информации в вопросе –

+0

Там вы идете. ответ обновлен. – Blizz

+0

Hi BLIZ благодарит за ответ, я проверю то же самое ... –

0

Вы не вызываете функцию __autoload так передавая ей параметры не имеет смысла. Вы можете использовать статические переменные, если хотите сохранить в нем какое-то состояние (например, отслеживать все загруженные классы/тайминги или что-то еще).

Не могли бы вы рассказать нам больше о логике, которую вы хотите сделать? Может быть, есть лучшие способы.

+0

Я не вызываю функцию автозагрузки. он вызывается автоматически всякий раз, когда происходит инициирование объекта класса. Вот почему имя автозагрузка. Пожалуйста, проверьте мои обновления –

0

Идея есть, используйте константу. По крайней мере, работал, чтобы решить мою проблему.

Вы можете определить константу только один раз для каждого файла, конечно, и вам придется адаптировать следующий код к вашей ситуации (то есть $dir - $viewClassMap).

Вот как я мог пройти еще один «PARAM» в автозагрузку:

define('DIR',$dir); 

function foo_autoload($class){ 
    $packages=array('pack','pack2'); 

    foreach($packages as $v){ 
     if(file_exists(DIR.$v.'/'.$class.'.php')==true){ 
      require(DIR.$v.'/'.$class.'.php'); 
      break; 
     } 
    } 
} 
spl_autoload_register('foo_autoload'); 

Если не кажется, имеет смысл определить константу с переменной, это делает, если эта переменная приходит от парам из метод. Весь этот код внутри моего метода.