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

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

Запись от Gcom размещена 07.09.2016 в 05:19
Показов 2161 Комментарии 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 вне форума
 
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru