Классы и функции автозапуска из разных файлов и каталогов
у меня есть этот код Автозагрузка :
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
ваша программа так же умна, как и вы. Если вы мечтаете решить проблему, выходящую за рамки возможностей основного языка, проблема заключается в вашей мечте, а не в языке.
для автоматической загрузки PHP-кода установите
auto_prepend_file
в php.ini для вашего сценария автозапуска. В качестве альтернативы вы можете сделать его централизованной точкой входа и прямым трафиком с mod_rewirte.
Это плохая практика. Оба методы зависят от конфигурации сервера, например .htaccess и не всегда доступны. Вы также можете переопределить существующие конфигурации или не переписать некоторые пути.
вы должны вручную централизовать запросы PHP (и запечатать точки входа) или require_once в каждой точке входа.
- PHP не функция автоматической загрузки поддержки. Включите все функции, которые вам могут понадобиться, если вы не можете потрудиться закодировать их посторонние включения.
посмотрите на Википедию, Magento или WordPress. У них сотни, если не тысячи глобальных функций.
не беспокойтесь о в том числе - доверяйте своему дисковому кэшу и включите опкод кэша. Статическое включение быстро и с кешем кода операции это может быть быстрее, чем условные нагрузки.
- Если у вас есть несколько классов / функций в файл, я не знаю динамический язык, который может волшебным образом выбрать правильный файл для включения. Ваш загрузчик выглядит довольно стандартный.
вы можете динамически определять что-либо в PHP. PHP никогда не может быть уверен, что он получит, если он действительно не запускает код. Автоматические загрузчики просто доверяют именам файлов как правильному и полному объявлению того, что находится в файле.
поскольку ваш загрузчик сканирует все папки, вы можете создать статическую карту файлов на сначала запустите и используйте карту для загрузки подпоследовательностей. Предполагая, что вы не собираетесь создавать файлы классов динамически с помощью PHP, конечно.