Как включить определенное имя файла из нескольких каталогов с помощью PHP

Я пытаюсь включить определенные файлы «представления администратора» из структуры папок. Я знаком с include/require или с тем, как рекурсивно включать папку, но все, что мне нужно сделать, это включить одно имя файла из каждого каталога — файл admin_view.php.

Итак, мой реж. структура выглядит следующим образом:

Файл, который нужно включить, находится в корне.

 - mods
  - type
    -- type1
       -admin_view.php
       -other files I do not need included
    -- type2
       -admin_view.php
       -other files I do not need included
    -- type3
       -admin_view.php
       -other files I do not need included

Как вы можете видеть, рекурсивное включение файлов не будет работать, а ручное включение их работает нормально, ... пока мы не начнем добавлять и удалять каталоги из основной папки «типа» ... тогда нам нужно вручную редактировать все коды включения.. Итак, я надеюсь найти функцию или фрагмент, который позволит мне просматривать все каталоги с каталогом «type» и включать ТОЛЬКО определенное имя файла (admin_view.php)

Это то, что я собрал воедино до сих пор, но это не работает... :(

$modulesDir = array (
    ROOT_DIR.'mods/type',

);
$view_name = "admin_view.php";

function __autoload($view_name) {
    global $modulesDir;
    foreach ($modulesDir as $directory) {
        if (file_exists($directory . $view_name)) {
                require_once ($directory . $view_name);
                return;
        }
    }
}

Огромное спасибо! Это место — отличный ресурс... и я очень ценю все знания, исправления, разъяснения и т. д., которые он предоставляет сообществу разработчиков! Дж

ИЗМЕНИТЬ:

Мне удалось загрузить файлы просмотра с помощью этого ... но у меня есть ощущение, что есть лучший способ сделать это:

ПОЯСНЕНИЕ

Я неправильно использовал функцию __autoload .. поскольку я НЕ загружаю классы .. просто файлы php для включения в основной документ ... извините за ошибку, я учусь :)


person revive    schedule 05.12.2009    source источник
comment
Что ж, я считаю, что ваше решение достаточно хорошее :) На самом деле проще, чем другие предложения. Если у вас нет особых проблем с этим, вы должны быть в порядке.   -  person Carlos Lima    schedule 05.12.2009
comment
хорошо.. если вы не видите никакого другого (читай: лучшего) способа сделать это, и нет проблем с тем, как это делается сейчас.. я продолжу с версией, которую я сделал Франкенштейном.. спасибо!   -  person revive    schedule 05.12.2009


Ответы (3)


Не уверен, что это единственная проблема в вашем коде, но проверьте это:

$modulesDir = array (
    ROOT_DIR.'mods/type',
);

if (file_exists($directory . $view_name)) { ... }

Вы не заканчиваете имена папок в $modulesDir на /

Когда вы делаете file_exists($directory . $view_name), вы на самом деле проверяете файл с именем

ROOT_DIR.'mods/typeadmin_view.php'

а не то что ты хотел

ROOT_DIR.'mods/type/admin_view.php'

Редактировать:

Что касается использования __autoload($name), следует помнить об одной вещи:

Из Документация по PHP: Классы автозагрузки:

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

Это означает, что если вы не используете классы или если классы, которые вы используете, уже «включены», он не будет вызываться.

Из вашего вопроса на первый взгляд неясно, используете ли вы классы или нет, даже если это выглядит так, как будто вы используете __autoload() неуместно.

Так или иначе, ваш подход к использованию glob("/path/*/file.php") кажется хорошим.
Он прост, понятен и выполняет свою работу.
Если вы не обнаружите с ним конкретной проблемы, все должно быть хорошо.

person Carlos Lima    schedule 05.12.2009
comment
Если он ответил на ваш вопрос, нажмите на галочку, чтобы он получил за это признание! - person Alt-Rock Ninja Cowgirl; 05.12.2009
comment
это определенно была необходимая коррекция. однако из того, что я читаю, я должен использовать что-то другое, кроме __autoload, для загрузки определенных файлов php в другой ... но улов очень ценится! - person revive; 05.12.2009
comment
Не стесняйтесь «принимать» ответ, который, по вашему мнению, решил вашу проблему (или вообще не отвечать, если вы думаете, что никто из них этого не сделал). Но, как правило, голосуйте за все ответы, которые, по вашему мнению, были полезными. Вы должны голосовать не только за свои вопросы, но и каждый раз, когда ищете проблему и находите полезный ответ. Вот как StackOverflow сортирует ответы, а также отдает должное тем, кто находит время помочь. В любом случае, надеюсь, вы решили свою проблему! :) - person Carlos Lima; 05.12.2009
comment
@Carlos... Я пытался проголосовать за тех, кто был полезен... но там написано, что для этого мне нужна репутация 15... :-/ Все здесь очень помогли, и я всем благодарен обратная связь.. надеюсь, скоро я смогу показать это, так как мой представитель превышает 15. - person revive; 06.12.2009
comment
Это точно. Я забыл об этом. В первый раз, когда я ответил на вопрос здесь, я даже не мог поставить ссылки на ответ из-за ограничения репутации. :) - person Carlos Lima; 06.12.2009


__autoload используется для включения классов автоматической загрузки.

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

Я не вижу никакого кода, создающего объект в вашем коде, если вы посмотрите на PHP __autoload, они предоставляют этот пример.

<?php
function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 
?>

Если вы хотите включить представление при создании объекта контроллера, что-то вроде этого должно работать, ваш контроллер должен быть назван как foobarController, чтобы это работало правильно.

$modulesDir = array (
    ROOT_DIR.'mods/type',

);
$view_name = "admin_view.php";

function __autoload($class_name) {
    global $modulesDir;
    if(preg_match('/(\w+)Controller/', $class_name, $match)){
      $class = $match[1];
      // TODO: include the class definition
      // require CONTROLLER_DIR . $class_name . '.php';
      foreach ($modulesDir as $directory) {
        if (file_exists($directory . strtolower($class) . '_view.php')) {
                require_once ($directory . strtolower($class) . '_view.php');
                return;
        }
      }
    }
}

$adminController = new AdminController();
person RageZ    schedule 05.12.2009
comment
да, но ваша точка зрения - это не классы, так зачем использовать __autoload ? - person RageZ; 05.12.2009