0

私はかなり見回してきましたが、この質問に対する簡潔な答えがどこにも見つかりません。おそらく、私よりもオートロードの経験が豊富な人なら、いくらか光を当てることができます. 非常に簡単な質問:

私は簡単に書いたautoloader

function __autoload($className){
    $className = BASEDIR . "include/class/" . str_replace("_", "/", $className) . ".php";
    require_once($className);
}

BASEDIRベース プロジェクト ディレクトリはどこにありますか。クラスを含めてうまく機能します-フィギュアに行きます。ただし、他のクラスを拡張するクラスを含めると、壊れ始めます。

このサイトの提案に従ってPEAR、クラスの命名規則を使用しています。したがって、私の「イベント」クラス (パーティーなどの実際のイベントを記述する) は次の場所にあります。

include/class/Event/Event.php

実際のクラス名は「Event」です。

クラスを自動ロードするときは、次のように参照します。

new Event_Event();

オートローダーはそれを次のように変換します。

"include/class/Event/Event.php";

問題は、Eventこの命名規則を利用する他のクラスによって拡張されたときに発生します。私は、例えば、使用しています:

class EventInstructed extends Event_Event

オートローダはどこを見ればよいかを認識していますが、私の Event クラス名は「Event_Event」ではなく「Event」であるため、間違ったクラスを探そうとしていて、見つけることができません。

問題は、どのように梨の命名規則を正しく利用するか、または問題を解決するためにオートローダーで追加の解析を行う必要があるかということです。アンダースコアで文字列を分解し、クラス名を取得して代わりに使用しますか?

命名規則はこちら: http://pear.php.net/manual/en/standards.naming.php

ありがとう!!

編集

私の最終的な解決策は、受け入れられた回答に記載されているとおりでした。クラスは次のような階層にあります。

include/class/Event/Event.php
include/class/Event/Lesson.php //  <-- extends Event

イベントファイル内:

abstract class Event_Event{
    //Class code....
}

レッスンファイル内:

class Event_Lesson extends Event_Event{
    //Class code....
}

最後に、__autoload 関数:

define("BASEDIR", __DIR__ . "/");

function __autoload($className){
    $className = BASEDIR . "include/class/" . str_replace("_", "/", $className) . ".php";
    echo $className . "<br / >";
    require_once($className);
}
4

2 に答える 2

1

常に次のように名前空間を追加する必要があります。

class Event_Instructed extends Event_Event

ファイル名はInstructed.phpこの場合でなければなりません。

于 2013-07-07T21:34:34.587 に答える