1

私はさまざまなフレームワークとそれらがクラスの自動ロードをどのように実装するかを調べてきましたが、PHPは初めてなので、その関数を正しく解釈しているかどうかわかりません。すべてのクラスを自動ロードするためにのみ使用して独自のクラスを作成しようとしましたが、クラスにアクセスできません。私のコードは次のようになります。

class Autoloader {
    private $map = array();
    private $directories = array();

    public function register() {
        spl_autoload_register(array($this, 'load'));
    }
    public function unregister() {
        spl_autoload_unregister(array($this, 'load'));
    }
    public function map($files) {
        $this->map = array_merge($this->map, $files);
        $this->load($this->map);
    }
    public function directory($folder) {
        $this->directories = array_merge($this->directories, $folder);
    }
    public function load($class) {
        if ($file = $this->find($class)) {
            require $file;
        }
    }
    public function find($file) {
        foreach ($this->directories as $path) {
            if (file_exists($path . $file . '.php')) {
                return $path . $file . '.php';
            }
        }
    }
}

ブートストラップファイルからクラスを次のようにロードします

require('classes/autoload.php');

$autoload = new Autoloader();
$autoload->map(array(
    'Config' => 'classes/config.php',
    'Sql' => 'classes/db.php'
));

$autoload->directory(array(
    'classes/'
));

$autoload->register();

次に、マップされたクラスの1つをインスタンス化しようとします

$sql = new SQL($dbinfo);
$sql->query($query);

私が行ったことの何が問題になっていますか?これを正しく行っていますか?基本的に、autoloadクラスがブートストラップファイルからクラスの配列をマップし、呼び出された/インスタンス化されたときにファイルを含め、使用されなくなったらそれらの含めを停止するようにします。

4

3 に答える 3

0

あなたのクラスはConfigあなたのファイルと呼ばれているようですconfig(大文字と小文字の区別に注意してください)。

推測 file_exists は で失敗し"classes/Config.php"ます。

現在、マップをまったく使用していません。

于 2012-05-11T16:27:50.290 に答える
0

問題はこの行にあると思います- asに$this->map = array_merge($this->map, $files)渡し$filesているが、メソッドのように値を取得しようとしているためです。$autoload->map()ArrayStringfind()

于 2012-05-11T16:30:30.577 に答える
0

「マップ」機能で何か奇妙なことが起こっているようです。

map が呼び出されると、load に配列が渡されますが、load 関数は、find 関数で使用される $class を文字列のように想定しているように見えます!

関数の呼び出し方法をもう一度見て、どのパラメーターがどこで使用されているかを追跡する必要があると思います。

于 2012-05-11T16:31:53.050 に答える