Как использовать переменные внутри функции __autoload () - PullRequest
1 голос
/ 04 августа 2010

Используемая мной функция автозагрузки выглядит следующим образом: -

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 должна быть удалена, и сначала необходимо вычислить загружаемое представление, а затемдолжна вызываться только автозагрузка.Это также является целью автозагрузки (чтобы включить файл класса, объект которого был инициирован).

Обновления

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

$view  = new search_classes();

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

Ответы [ 3 ]

3 голосов
/ 04 августа 2010

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

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

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

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 голосов
/ 23 января 2014

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

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

Вот как я мог бы передать другой «параметр» в автозагрузку:

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');

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

0 голосов
/ 04 августа 2010

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

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

...