2012-06-14 1 views
1

Я получаю больше indepth с php, и я создаю свою собственную инфраструктуру mvc mini, чтобы узнать ООП.php не может redeclare _autoload()

У меня есть файл .htaccess, который перенаправляет все на index.php. В index.php я включаю файл boootstrap.php для анализа URL-адреса и загрузки файла php-файла класса.

Теперь, когда я добавляю ActiveRecord http://www.phpactiverecord.org, чтобы добавить доступ к базе данных. Я получаю ошибку:

Фатальная ошибка: Невозможно переопределить класс AutoLoader в /home/i554246/public_html/mvc/lib/Autoloader.php в строке 4

Я не знаю, как остановить конфликт.

index.php:

include(MVC_CORE_INCLUDE_PATH . DS . 'Bootstrap.php') 
include(MVC_CORE_INCLUDE_PATH . DS . 'activerecord/ActiveRecord.php'); 

autoloader.php, который включен в bootstrap.php

<?php 

class AutoLoader 
{ 
    public static function Load($Class) 
    { 
     $File = BASEDIR.$Class.'.php'; 

     if(is_readable($File)) 
     { 
      require($File); 
     } 
     else 
     { 
      die('Requested module "'.$Class.'" is missing. Execution stopped.'); 
     } 
    } 
} 

spl_autoload_register('AutoLoader::Load'); 

ActiveRecord.php

if (!defined('PHP_ACTIVERECORD_AUTOLOAD_DISABLE')) 
    spl_autoload_register('activerecord_autoload',false,PHP_ACTIVERECORD_AUTOLOAD_PREPEND); 

function activerecord_autoload($class_name) 
{ 
    $path = ActiveRecord\Config::instance()->get_model_directory(); 
    $root = realpath(isset($path) ? $path : '.'); 

    if (($namespaces = ActiveRecord\get_namespaces($class_name))) 
    { 
     $class_name = array_pop($namespaces); 
     $directories = array(); 

     foreach ($namespaces as $directory) 
      $directories[] = $directory; 

     $root .= DIRECTORY_SEPARATOR . implode($directories, DIRECTORY_SEPARATOR); 
    } 

    $file = "$root/$class_name.php"; 

    if (file_exists($file)) 
     require $file; 
} 
?> 

ответ

1

Возможно изменить

if (file_exists($file)) 
    require $file; 

в

if (file_exists($file)) 
    require_once($file); 
+0

Если это возможно, я не хотел бы изменить что-нибудь ActiveRecord.php как это третья сторона, и может привести к модернизации вопросов. Будет ли другой способ? –

+0

Возможно, но я склонен согласиться с [Nanne] (http://stackoverflow.com/users/546999/nanne), что следующим шагом должен быть отладка стека. Думаю, вам нужен точный отчет о порядке, в котором происходят события. Также возьмите совет Нанна по пространствам имен - даже если в корне этой проблемы нет конфликта пространства имен, дополнительный бит дисциплины поможет вам исключить красные сельди. –

+0

Да Я благодарю –

1

Вы либо попытаться включить файл дважды (вы можете использовать require_once) или у вас есть 2 классов (один из библиотеки вы используете?) С таким же именем.

Если есть, по-видимому, 2 класса, называемые AutoLoader, возможно, вы захотите изучить пространства имен. Я не могу вспомнить phpactiverecord с классом, который называется, но, поскольку вы можете использовать несколько библиотек, вы должны были столкнуться с этим.

Лучшим способом было бы разместить собственный класс автозагрузчика в namespace. Убедитесь, что вы держите все ваши звонки правильно, поэтому вызовы заряжания должны \yournamespace\ перед ним, и звонки внутри автозагрузчика может понадобиться Предварение \ к (как \Exception, например)

+0

Если я сначала загружаю ActiceRecord.php, у меня есть проблема с Fatal error: Can not redeclare activerecord_autoload() (ранее объявлено в /home/i554246/public_html/mvc/lib/activerecord/ActiveRecord.php:28) в /home/i554246/public_html/mvc/lib/activerecord/ActiveRecord.php в строке 48 –

+0

Ну, у activerecord нет этой проблемы самостоятельно, поэтому должно быть что-то еще. Вы, вероятно, включили этот файл дважды, возможно, оба автозагрузчика включают его? Я бы посоветовал вам просто отладить его: поместите что-то, что регистрирует stacktrace в этом дважды называемом файле, а затем проверьте, что происходит: теперь вы знаете, какие части кода загружают этот файл. во второй раз вы получите сообщение об ошибке, но затем можете продолжить и не допустить его загрузки дважды. – Nanne

+0

Спасибо, я добавил require_once в ActiveRecord.php, и ошибка переместилась на следующий включенный и пожаловалась на этот класс. Снова я добавил require_once к этому, и ошибка снова переместилась на следующую, включив и не сможет повторно использовать этот класс. Кажется, перезагружает index.php, где все входящие. Очень странно, только когда я включил ActiveRecords. –

0

Я переместил линию

$Bootstrap = new Bootstrap(); 

под

include(MVC_CORE_INCLUDE_PATH . DS . 'Bootstrap.php'); 
include(MVC_CORE_INCLUDE_PATH . DS . 'Controller.php'); 

но выше

require_once 'lib/activerecord/ActiveRecord.php'; the ActiveRecord seemed to want to load it again 
1

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

Поскольку он совместим с PSR-0, его можно загрузить с помощью собственной утилиты загрузки (при условии, что она охватывает это соглашение). Если вы это сделаете, отключите утилиту автозагрузки PHP-AR.

define('PHP_ACTIVERECORD_AUTOLOAD_DISABLE', true); 

Ванильный погрузчик moslty полезна для поиска классов модели, которые не будут необходимы, если вы кладете их в своем собственном пространстве имен.Поскольку ваша структура может не соответствовать соглашению PHP-AR относительно того, где находятся модели, кажется правильным отключить этот автозагрузчик.

Убедитесь, что пример интеграции PHP-AR с каркасом лития: li3_activerecord