Форум программистов, компьютерный форум, киберфорум
Gcom
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Оценить эту запись

Автозагрузка классов (при вызове его метода) из любой директории сайта.

Запись от Gcom размещена 07.09.2016 в 05:19

Что бы решить данную проблему с путями, добавляем класс IncludePath (лучше в index.php):
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class IncludePath
{
    private $pathToDirectory;
    private $aPathToDirectory;
    
    public function setPath($pathToDirectory = '')
    {
        self::setIncludePath(self::getArrayPathToDirectory($pathToDirectory));
        spl_autoload_register(array('self', 'autoloadClass'));
    }
 
    private function getArrayPathToDirectory($pathToDirectory)
    {
        static $aPathToDirectory;
 
        if (!isset($aPathToDirectory)) $aPathToDirectory = array();
 
        if (is_dir($pathToDirectory)) {
            $aNamesFileAndDirectory = scandir($pathToDirectory); 
            
            if (is_array($aNamesFileAndDirectory)) {
                $aNamesFileAndDirectory = array_diff($aNamesFileAndDirectory, array('.', '..'));
                
                if (!empty($aNamesFileAndDirectory)) {
                    
                    foreach($aNamesFileAndDirectory as $nameFileOrDirectory) {
                        $fullPathToFileOrDirectory = $pathToDirectory.DIRECTORY_SEPARATOR.$nameFileOrDirectory;
                        
                        if (is_dir($fullPathToFileOrDirectory)) {
                            
                            $goodPath = explode($_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR, $pathToDirectory.DIRECTORY_SEPARATOR.$nameFileOrDirectory.DIRECTORY_SEPARATOR);
                            $aPathToDirectory[] = $goodPath[1];
 
                            self::getArrayPathToDirectory($fullPathToFileOrDirectory);
                        }
                    }
                }
            }
        }
        return $aPathToDirectory;
    }
 
    private function setIncludePath($aPathToDirectory)
    {
        set_include_path('.'.PATH_SEPARATOR.implode(PATH_SEPARATOR, $aPathToDirectory));
    }
 
    private static function autoloadClass($className)
    {
        $fileName = strtolower($className.'.php');
        require_once($fileName);
    }
 
}
 
IncludePath::setPath($_SERVER['DOCUMENT_ROOT']); # создать "дерево" каталогов относительно корневой директории $_SERVER['DOCUMENT_ROOT']
Теперь если вызвать метод myFunction() класса MyClass мы просто напишем:
PHP
1
MyClass::myFunction();
Класс автоматом погрузиться и не важно в какой директории будет находиться файл myclass.php с классом MyClass:
PHP
1
2
3
4
5
6
7
8
class MyClass
{
    
    function myFunction()
    {
        # code...
    }
}
Размещено в Без категории
Показов 1894 Комментарии 1
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для Gcom
    Мне кажется, что это бредовая идея извлекать путь до файла класса из его названия, поясню: а если нужно переместить класс? ну можно ручками поправить пути, вариант, если это действие с одним классом, а если их больше одного, в общем возни только прибавиться. Спросите зачем перемещать классы? да допустим просто изменилась архитектура проекта (появились новые папочки и файлы, какие то файлы и папочки переместились в другую) с моим подходом ты просто их скопировал в нужную папочку и все, голова не о чем не болит больше.
    Ну это только начало такого подхода, допустим попадется такая ситуация: Что подключится, если у меня два файла с одинаковым именем в разных директориях? Например, файл config.php?
    Выход очевиден: А зачем нам два файла config.php? Типа у нас будет два класса Сonfig и еще раз Сonfig, где логика? Можно проще Сonfig_main и Сonfig_DB и проблема с названиями и путями решена. Просто нужно давать нормальные имена классам, при желании можно указывать префикс перед именем (например gcom_Сonfig_main и gcom_Сonfig_DB) тут сразу видно что повторов не будет, даже если мы захотим использовать сторонние библиотеки, пусть даже тот же Сonfig, ну опять же нужно указывать чего этот конфиг, типа название класса будет иметь маску: <Чей класс (производитель)>_<Название класса>_<Наименование модуля, где используется данный класс> тогда и путаницы не какой не будет, и плюс ко всему перемещение Библиотек (Модулей) будут происходить в пару кликов.
    Запись от Gcom размещена 08.09.2016 в 07:30 Gcom вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru