Search
Write a publication
Pull to refresh

Универсальный класс автозагрузки

Reading time3 min
Views19K
Прочитав этот хабратопик. Решил поделиться своим классом автозагрузчика (вдруг кому пригодится), который умеет рекурсивно искать нужные файлы, не только классы, но и любой другой, переданный ему файл, ну и если там где указано файл не найден, то производит поиск по всему серверу начиная от корня, если файл найден где-то не там, генерит соответствующее сообщение, умеет работать с пространством имен и логировать свои действия в случае необходимости.


<?php
namespace youNameSpace
{
  /**
   * Усовершенствованный класс автозагрузчик
   * 
   * Умеет загружать как недостающие классы, так и указанные файлы.<br/>
   * Больше нет необходимости писать инклюды, достаточно вызвать<br/>
   * функцию автозагрузки и сказать ей имя и расширене файла,<br/>
   * а можно еще и дирректорию уточнить(иначе ищем из корня), и будет счастье.
   * 
   * @author Автор: Барулин Максим
   * @version 1.0
   * @copyright: Барулин Максим
   */
  class Autoloader
  {
    /**
     *переменная, отвечающая за отладку
     * 
     * @var type const
     * 
     */
    const debug = 0;
    
    public function __construct()
    {
      ;
    }
     /**
     * Функция прямого подключения класса или файла.<br/>
     * В случае неудачи, вызывает функцию рекурсивного поиска.
     * 
     * @param string $file имя файла(без расширения)
     * @param string $ext расширение файла(без точки)
     * @param string $dir директория для поиска(без первого и последнего слешей)
      * 
     * @return string
     * @return false
     * 
     */
    public static function autoload($file, $ext = FALSE, $dir = FALSE)
    {
      $file = str_replace('\\', '/', $file);

      if($ext === FALSE)
      {
        $path = $_SERVER['DOCUMENT_ROOT'] . '/classes';
        $filepath = $_SERVER['DOCUMENT_ROOT'] . '/classes/' . $file . '.php';
      }
      else
      {
        $path = $_SERVER['DOCUMENT_ROOT'] . (($dir) ? '/' . $dir : '');
        $filepath = $path . '/' . $file . '.' . $ext;
      }
      
      if (file_exists($filepath))
      {
        if($ext === FALSE)
        {
          if(Autoloader::debug) Autoloader::StPutFile(('подключили ' .$filepath));
          require_once($filepath);
        }
        else
        {
          if(Autoloader::debug) Autoloader::StPutFile(('нашли файл в ' .$filepath));
          return $filepath;
        }
      }
      else
      {
        $flag = true;
        if(Autoloader::debug) Autoloader::StPutFile(('начинаем рекурсивный поиск файла <b>' . $file . '</b> в <b>' . $path . '</b>'));
        return Autoloader::recursive_autoload($file, $path, $ext, $flag);
      }
    }

     /**
     * Функция рекурсивного подключения класса или файла.
     * 
     * @param string $file имя файла(без расширения)
     * @param string $path путь где ищем
     * @param string $ext расширение файла
     * @param string $flag необходим для прерывания поиска если искомый файл найден
      * 
     * @return string
     * @return bool
     * 
     */
    public static function recursive_autoload($file, $path, $ext, &$flag)
    {
      if (FALSE !== ($handle = opendir($path)) && $flag)
      {
        while (FAlSE !== ($dir = readdir($handle)) && $flag)
        {
          
          if (strpos($dir, '.') === FALSE)
          {
            $path2 = $path .'/' . $dir;
            $filepath = $path2 . '/' . $file .(($ext === FALSE) ? '.php' : '.' . $ext);
            if(Autoloader::debug) Autoloader::StPutFile(('ищем файл <b>' .$file .'</b> in ' .$filepath));

            if (file_exists($filepath))
            {
              $flag = FALSE;
              if($ext === FALSE)
              {
                if(Autoloader::debug) Autoloader::StPutFile(('подключили ' .$filepath ));
                require_once($filepath);
                break;
              }
              else
              {
                if(Autoloader::debug) Autoloader::StPutFile(('нашли файл в ' .$filepath ));
                return $filepath;
              }
            }
            $res = Autoloader::recursive_autoload($file, $path2, $ext, $flag); 
          }
        }
        closedir($handle);
      }
      return $res;
    }
    /**
     * Функция логирования
     * 
     * @param string $data данные для записи
      * 
     * @return void
     * 
     */
    private static function StPutFile($data)
    {
      $dir = $_SERVER['DOCUMENT_ROOT'] .'/Log/Log.html';
      $file = fopen($dir, 'a');
      flock($file, LOCK_EX);
      fwrite($file, ('║' .$data .'=>' .date('d.m.Y H:i:s') .'<br/>║<br/>' .PHP_EOL));
      flock($file, LOCK_UN);
      fclose ($file);
    }
  }
  \spl_autoload_register('youNameSpace\Autoloader::autoload');
}

?>
Tags:
Hubs:
Total votes 26: ↑7 and ↓19-12
Comments20

Articles