2012-06-14 62 views
1

我越來越深刻的PHP和我創建我自己的迷你mvc框架來學習OOP。php不能重新聲明_autoload()

我有一個.htaccess文件,將所有內容重定向到index.php。在index.php中,我包含一個名爲boootstrap.php的文件來解析url並加載類php文件。

現在我正在添加ActiveRecord http://www.phpactiverecord.org來添加數據庫訪問。我得到的錯誤:

致命錯誤:不能重新聲明類自動裝載在/home/i554246/public_html/mvc/lib/Autoloader.php第4行

我不知道如何停止衝突。

的index.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

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

autoloader.php或許改變

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

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

如果可能的話我不想改變什麼的ActiveRecord.php,因爲它是第三方,並可能導致升級問題。會有另一種方式嗎? –

+0

也許,但我傾向於同意[Nanne](http://stackoverflow.com/users/546999/nanne)您的下一步應該是調試堆棧。我認爲你需要對事情發生順序的精確說明。同樣,對Nanne的命名空間的建議 - 即使這個問題的根源沒有命名空間衝突,額外的懲罰也會幫助你排除紅鯡魚。 –

+0

是的,我會感謝 –

1

你要麼嘗試包括文件兩次(你可能想使用require_once),或者你有2類(一個從你使用一個庫?)具有相同名稱。

如果似乎有兩個類叫做AutoLoader,您可能需要查看名稱空間。我不記得phpactiverecord有一個叫做那個類的類,但是因爲你可能使用了幾個你肯定會碰到的類庫。

最好的辦法是將自己的自動加載器類放入namespace。請務必保持您的來電正確的,所以到磁帶自動加載調用應該在它的前面有\yournamespace\,磁帶自動加載機內通話可能需要在前面加上一個\到(如\Exception例如)

+0

如果我首先加載ActiceRecord.php,它有一個致命錯誤的問題:無法重新聲明activerecord_autoload()(以前在/home/i554246/public_html/mvc/lib/activerecord/ActiveRecord.php:28中聲明)in /home/i554246/public_html/mvc/lib/activerecord/ActiveRecord.php on line 48 –

+0

那麼,activerecord本身沒有這個問題,所以肯定還有其他的事情要做。您可能包含該文件兩次,也許兩個自動加載器都包含它?我建議你只是調試一下:把記錄堆棧跟蹤的東西放在那個雙重調用的文件中,然後檢查會發生什麼:現在你知道代碼的哪些部分會加載該文件。第二次你會得到錯誤,但你可以繼續下去,並防止它被加載兩次。 – 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); 

香草裝載機是非常有用的尋找模型類,如果你把它們放在他們自己的名字空間中是不需要的。由於您的框架可能不遵循PHP-AR約定關於模型的位置,因此禁用該自動裝載器似乎是正確的。

檢查PHP-AR整合與鋰框架,例如:li3_activerecord