1

私はphpをより深く理解し、OOPを学ぶために独自のミニmvcフレームワークを作成しています。

すべてをindex.phpにリダイレクトする.htaccessファイルがあります。index.php に、bootstrap.php というファイルを含めて、URL を解析し、クラスの php ファイルをロードします。

ActiveRecord http://www.phpactiverecord.orgを追加して、データベース アクセスを追加します。エラーが発生します:

致命的なエラー: 行 4 の /home/i554246/public_html/mvc/lib/Autoloader.php でクラス AutoLoader を再宣言できません

紛争を止める方法がわかりません。

index.php:

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

bootstrap.php に含まれる autoloader.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;
}
?>
4

4 に答える 4

1

AutoLoaderPHP-ActiveRecordにはクラスがありません。ここで何が起こるかというと、ファイルをロードしているローダーが2つあるということです。

PSR-0に準拠しているため、独自のロードユーティリティを使用してロードできます(その規則を採用していることを前提としています)。その場合は、PHP-AR自動読み込みユーティリティを無効にしてください。

define('PHP_ACTIVERECORD_AUTOLOAD_DISABLE', true);

バニラローダーは、独自の名前空間に配置する場合に必要とならないモデルクラスを見つけるのに非常に便利です。フレームワークはモデルの場所に関するPHP-AR規則に準拠していない可能性があるため、そのオートローダーを無効にするのは正しいようです。

PHP-ARとリチウムフレームワークの統合の例を確認してください:li3_activerecord

于 2012-06-14T17:35:35.097 に答える
1

ファイルを 2 回インクルードしようとするか ( を使用したい場合がありrequire_onceます)、同じ名前のクラスが 2 つ (使用するライブラリの 1 つですか?) あります。

という名前のクラスが 2 つあるように思われる場合はAutoLoader、名前空間を調べてください。それと呼ばれるクラスを持つphpactiverecordを思い出すことはできませんが、いくつかのライブラリを使用する可能性があるため、これに遭遇することになりました。

最善の方法は、独自のオートローダー クラスをnamespace. すべての呼び出しが正しいことを確認してください。そのため、オートローダーへの呼び出しはその\yournamespace\前にある必要があり、オートローダー内の呼び出しには to を前に付ける必要がある場合があります\(\Exceptionたとえば)。

于 2012-06-14T13:55:22.413 に答える
1

たぶん変わる

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

if (file_exists($file))
    require_once($file);
于 2012-06-14T13:53:30.940 に答える
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
于 2012-06-14T15:18:40.600 に答える