шлицов реестр Автозагрузка не работает в включаемые файлы
Я использую spl_autoload_register
для того, чтобы загрузить классы.
У меня есть файл index.php
, который включает в себя файл init.php
. Функция spl_autoload_register
вызывается в файле init.php
.
В файле index.php
он работает правильно: я могу создавать классы и прочее, их имена разрешаются.
index.php
, я включаю другой файл, work.php
, чтобы выполнить какую-то конкретную задачу.
Странно, но в work.php
класс, который я использую, не найден.
Если я снова вызову spl_autoload_register
в work.php
, класс может быть разрешен.
Действительно странно, что это поведение не является последовательным: на моем тестовом сервере мне не нужно дублировать вызов spl_autoload_register
, но на моем рабочем сервере это обязательно.
Я пропустил некоторые варианты в php.ini
?
Edit / Updated: вот содержимое файла init.php
, на всякий случай:
<?php
function my_autoload($class){
include 'class/' . $class . '.class.php';
}
spl_autoload_register('my_autoload');
?>
И мой индекс.php:
<?php
require_once 'include/init.php';
$barcode = new Barcode();
// here is a bunch of test and stuff
include 'work.php';
?>
И моя работа.php:
<?php
$myObj = new Barcode();
// more useles stuff
?>
Штрих-код создан безупречно в указателе.php код частично, но терпит неудачу в работе.php часть...
2 ответа:
Проверьте настройки
include_path
, если они содержат локальный каталог.Вообще не очень хорошая идея использовать относительные пути. Легко создать абсолютный путь, который будет относительно вашего init.php файл выглядит так:
function my_autoload($class){ include __DIR__.'/class/' . $class . '.class.php'; }
Этот код предполагает, что ваш init.файл php находится в той же папке, что и папка' class'.
Кроме того, вместо того, чтобы потенциально создавать ошибки с слепым включением файлов, которые могут или не могут существовать в данном пути, проверьте существование файла перед тем, как включая его:
function my_autoload($class){ $file = __DIR__.'/class/' . $class . '.class.php'; if(file_exists($file)) { include $file; } }
Обратите внимание, что
__DIR__
- это функция PHP 5.3, которая недоступна на хостах с PHP 5.2. Вы можете заменить его наdirname(__FILE__)
Кроме того, обратите внимание, что в Linux файл ищется с учетом регистра , в то время как в большинстве установок Mac OS X файл ищется без учета регистра. Если вы создадите экземпляр класса
MyClass
, Linux будет искатьMyClass.class.php
, а Mac OS X также загрузит класс, если он находится в файле с именемmyclass.class.php
,Myclass.class.php
, и т.д.
Ну, вообще-то, я тупица. Проблема была не с include path etc, а с конфигурацией apache : MultiViews.
У моего сайта есть одна точка доступа: index.РНР. И я перенаправляю все на него, используя перезапись url. Но благодаря опциям multiviews, перезапись url не работала должным образом, если url был с тем же именем, что и файл.
Мой каталог содержит индекс.php, и работа.РНР.
Мой сценарий с rewrite был таким : если вы нажмете www.mywebsite.com/work-вы идете по указателю.php с param url=работа. индекс.php инициализирует все, а затем включает работу.php
Но благодаря вариантам MultiViews, если я бил www.mywebsite.com/work, он будет искать файл, найти работу.php, и вызывайте его напрямую. Значение: нет init, значение: нет spl_autoload_register.
Спасибо за ваши ответы и извините.