2014-09-08 3 views
1

Я классовую структуру (дерево), как это:PHP каталог имен автоматической загрузки

- garcha/ 
| - html/ 
|  Tag.php 
|  VTag.php 
|  etc.. 

Что работает: (авто-нагружен spl_autoload_register)

use garcha\html; 

$tag = new html\Tag('a'); 

Не удается:

use garcha\html; 

$tag = new Tag('a'); 

Чтобы добиться этого без: (я не хочу писать use заявление линии каждого класса файла построчно, то, чтобы указать на каталог класс и использовать классы без родительского пространства имен)

use garcha\html\Tag; 
use garcha\html\VTag; 
... 

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

в двух словах: Я пытаюсь автоматической загрузки класса в пространстве имен каталог и использовать в нем классы с неквалифицированными именами.

Авто-погрузчик функция:

class AutoLoader 
{ 
    protected static $pathes = array(); 

    /** 
    * add pathes 
    * 
    * @param string $path 
    */ 
    public static function addPath($path) 
    { 
     $path = realpath($path); 

     if ($path) 
     { 
      self::$pathes[] = $path . DIRECTORY_SEPARATOR; 
     } 
    } 

    /** 
    * load the class 
    * @param string $class 
    * @return boolean 
    */ 
    public static function load($class) 
    { 
     $classPath = $class.'.php'; // Do whatever logic here 

     foreach (self::$pathes as $path) 
     { 
      if (is_file($path . $classPath)) 
      { 
       require_once $path . $classPath; 

       return true; 
      } 
     } 

     return false; 
    } 
} 

Добавление пути:

AutoLoader::addPath(BASE_PATH.DIRECTORY_SEPARATOR.'vendor'); 

авто-погрузочные работы, вопрос о том, как обращаться с

use garcha\html; // class directory 

и использовать классы без l eading html

$tag = new Tag('p'); // not $tag = new html\Tag('p'); 
+0

что ваш 'самостоятельно :: $ pathes' установлен – GGio

+0

Почему бы не использовать полный путь пространства имен? Вам придется изменить его, если вы измените путь позже, 'use' или не – Machavity

+0

@GGio Я обновил вопрос –

ответ

0

Вы можете попробовать различные решения:

Первое: вы можете добавить garcha/html в вашей pathes переменной как ::addPath('garcha/html')

Второе: попытаться использовать следующий код в авто погрузчик

foreach (glob("garcha/*.php") as $filename) 
{ 
    require_once $filename; 
} 

glob в основном будет соответствовать всем файлам, заканчивающимся .php, а затем вы можете использовать их, чтобы либо добавить их в свою переменную pathes, либо просто включить их.

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

Edit: Попробуйте это:

public static function load($class) 
{ 
    // check if given class is directory 
    if (is_dir($class)) { 
     // if given class is directory, load all php files under it 
     foreach(glob($class . '/*.php') as $filePath) { 
      if (is_file($filePath)) 
      { 
      require_once $filePath; 

      return true; 
      } 
     } 
    } else { 
     // otherwise load individual files (your current code) 
     /* Your current code to load individual class */ 
    } 

    return false; 
} 
+0

Спасибо, но это не то, что я хочу, потому что там также будут 'garcha \ validator',' garcha \ database' и т. Д., Включая все файлы внутри, не кажется хорошей идеей. Также это не будет достойно, потому что я просто просто использую 'html \ Tag' или' Database \ Connection' –

+0

@GeorgeGarchagudashvili попробуйте мой обновленный ответ – GGio

+0

Если необходимое решение не может быть выполнено без загрузки всех файлов, я бы продолжил работу с текущей доступностью. Большое спасибо, кажется, это было бы единственным решением или написанием заявления использования для каждого класса. –

Смежные вопросы