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

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

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

Что бы решить данную проблему с путями, добавляем класс 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...
    }
}
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 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 вне форума
 
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru