Классы и функции автозапуска из разных файлов и каталогов

у меня есть этот код Автозагрузка :

function __autoload($class_name)
{
    //class directories
    $directorys = array(
        './Controls/',
        './Config/',
        './Utility/'
    );
    //for each directory
    foreach($directorys as $directory)
    {
        //see if the file exsists
        if(file_exists($directory.$class_name . '.php'))
        {
            require_once($directory.$class_name . '.php');
            //only require the class once, so quit after to save effort (if you got more, then name them something else
            return;
        }
    }
}

у меня есть три каталога, в которых хранятся все мои классы и функции.

могу ли я создать один файл автозапуска в Controls каталог и использовать его для загрузки всех функций или классов в других файлах php, я имею в виду, например на /portal/main/index.php

можно ли загружать классы, которые являются controls и config в индекс.php-файл без каких-либо файл в выше

я имею в виду, что autoload автоматически понимает, какой файл запрашивает класс или функцию и включает этот файл для него.

обновленный код :

function __autoload($class_name)
{
    //class directories
    $directorys = array(
        '/Controls/',
        '/Config/',
        '/Utility/'
    );
    //for each directory

    $ds = "/"; //Directory Seperator
    $dir = dirname(__DIR__); //Get Current file path
    $windir = ""; //Windows Directory Seperator
    $path = str_replace($windir, $ds, $dir);

    foreach($directorys as $directory)
    {
        //see if the file exsists
        if(file_exists( $path . $directory . $class_name . '.php'))
        {
            require_once( $path . $directory . $class_name . '.php');
            //only require the class once, so quit after to save effort (if you got more, then name them something else
            return;
        }
    }
}

я обновил код и он включает файлы, но единственная проблема, которая у меня есть, заключается в том, что эта функция не работает автоматически,

например, мой файл автозапуска находится в : root/Controls/autoload.php и мне нужны некоторые классы и функции :root/portal/index.php

когда я определяю классы в индекс.PHP я получаю ошибку, что файл не существует и я должен вручную вызвать на index.php

как я могу сделать autoload smart, который я не должен был включать в каждый файл для включения классов ?

пожалуйста, помогите мне. заранее спасибо

2 ответов


простое ручное решение: положите ваш autoload файл в корне проекта и включить его в индексный файл это сделает работу.

но если вы хотите использовать htaccess или php.ini : Поместите файл с именем .user.ini в корень документа и добавить auto_prepend_file


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

  2. для автоматической загрузки PHP-кода установите auto_prepend_file в php.ini для вашего сценария автозапуска. В качестве альтернативы вы можете сделать его централизованной точкой входа и прямым трафиком с mod_rewirte.

Это плохая практика. Оба методы зависят от конфигурации сервера, например .htaccess и не всегда доступны. Вы также можете переопределить существующие конфигурации или не переписать некоторые пути.

вы должны вручную централизовать запросы PHP (и запечатать точки входа) или require_once в каждой точке входа.

  1. PHP не функция автоматической загрузки поддержки. Включите все функции, которые вам могут понадобиться, если вы не можете потрудиться закодировать их посторонние включения.

посмотрите на Википедию, Magento или WordPress. У них сотни, если не тысячи глобальных функций.

не беспокойтесь о в том числе - доверяйте своему дисковому кэшу и включите опкод кэша. Статическое включение быстро и с кешем кода операции это может быть быстрее, чем условные нагрузки.

  1. Если у вас есть несколько классов / функций в файл, я не знаю динамический язык, который может волшебным образом выбрать правильный файл для включения. Ваш загрузчик выглядит довольно стандартный.

вы можете динамически определять что-либо в PHP. PHP никогда не может быть уверен, что он получит, если он действительно не запускает код. Автоматические загрузчики просто доверяют именам файлов как правильному и полному объявлению того, что находится в файле.

поскольку ваш загрузчик сканирует все папки, вы можете создать статическую карту файлов на сначала запустите и используйте карту для загрузки подпоследовательностей. Предполагая, что вы не собираетесь создавать файлы классов динамически с помощью PHP, конечно.