шлицов реестр Автозагрузка не работает в включаемые файлы


Я использую 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 3

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.

Спасибо за ваши ответы и извините.