0

PSR-0準拠のatmである独自のMVCフレームワークを作成しました。php-ActiveRecord を ORM として使用します。User名前空間 に存在する という名前のコントローラーから、名前空間に存在TapMVC\Applicationする ActiveRecord モデル ALSO を呼び出そうとする問題を発見しました。UserTapMVC\Db

namespace TapMVC\Application;

use TapMVC\Db;

class User extends Controller {
    function index() {
        print_r(Db\User::find('all'));
    }
}

これにより、次のエラーが発生します。

12 行目の /path/to/project/app/Controllers/user.php でクラス TapMVC\Application\User を再宣言できません

12行目は、ユーザーコントローラーのプロトタイプ/宣言です。

なぜ私はこれを行うことができないのですか?名前空間が異なり、インスタンス化時に名前空間プレフィックスを持っているクラスの場合、同じ名前を付けても問題ないと思いましたか? また、データモデルは自動ロードによってコントローラーの前に宣言されているように見えます (エラーをトリガーするユーザーコントローラー宣言であるため)。では、データモデルが名前空間にあり、コントローラーの場所にTapMVC\Dbない場合に競合が発生するのはなぜですか?TapMVC\Application

異なる名前空間を定義しても、PHPはアクティブなファイルと同じ名前空間でオブジェクトを宣言することがわかりますが、よくわかりません。

誰かが助けてくれることを願っているので、データモデルに次のように名前を付ける必要はあり(ProjectName-prefix)Userません。データベーステーブルを編集して、ユーザーモデルとユーザーコントローラーを作成します。

4

1 に答える 1

0

エラーが見つかりました!:-D

問題は、名前空間を処理しなかったため、コントローラー、モデルなどの自動読み込み関数にありました。したがって、同じ名前のコントローラーまたはモデルをロードしようとすると、spl_autoload_register関数はコントローラーをチェックすることから始まります。関数はクラスの名前空間を無視するため、次の両方の場合になります。ユーザーコントローラークラスTapMVC\Application\Userを見つけて、オートロードを停止します。TapMVC\Db\Userリストし、それを宣言しようとします。

名前空間を処理し、コントローラー/モデルが正しい名前空間にある場合にのみロードされるようにすると、これはすべて解決しました。そうでない場合、関数は何も処理せず、関数spl_autoload_registerは自動ロード関数のリストを下に続けます。

質問は想像以上にフレームワーク固有のものであり、オートローディングに要約されましたが、これは問題だとは思いませんでした...何らかの理由で、申し訳ありません。エラーが見つかったことを知ってうれしいです。

于 2013-06-10T08:31:28.893 に答える