0

私がしばしば悩まされるのは、PHP にクラスパスと依存関係管理システムがないことです。提案できるフレームワークはありますか?Pear は検討するのに適したシステムだと聞きましたが、他に何があるか知りたいです。

例を挙げると... A.php、B.php、および C.php ファイルがあり、A は C に依存する B に依存し、3 つすべてが異なるフォルダーにあります。

したがって、A.php に B.php をインクルードしたら、C.php もインクルードする必要があります。B.php で require_once("C.php") と入力しても機能しません。なぜなら、require_once は、B.php と C.php の間ではなく、A.php と C.php の間の相対パスを呼び出す必要があるためです。

4

3 に答える 3

3

この問題のために、私はオートローダーを好む傾向があります。特定のファイルをスキャンし、それらからファイルにマップされたクラスのリストを作成する堅牢なスクリプトを作成することは難しくありません。これが私がそれを行う方法です:

$classes = array();

//this is the main function, give it a file and it will map any
//classes it finds in the file to the path. How you find the files
//is up to you, only you know your directory structure, but I
//generally set up a few folders that hold my classes, and have
//the script recurse through those passing each file it finds through
//this function
function get_php_classes($file) {
    global $classes;
    $php_code = file_get_contents($file);
    $tokens = token_get_all($php_code);
    $count = count($tokens);

    //uses phps own parsing to figure out classes
    //this has the advantage of being able to find
    //multiple classes contained in one file
    for ($i = 2; $i < $count; $i++) {
        if (   $tokens[$i - 2][0] == T_CLASS
            && $tokens[$i - 1][0] == T_WHITESPACE
            && $tokens[$i][0] == T_STRING) {

            $class_name = $tokens[$i][1];
            //now we map a class to a file ie 'Autoloader' => 'C:\project\Autoloader.cls.php'
            $classes[$class_name] = $file;
        }
    }
}

$fh = fopen('file_you_want_write_map_to', 'w');
fwrite($fh, serialize($classes));
fclose($fh);

これはファイル マッピングを生成するスクリプトで、新しいクラスを追加するたびに一度実行します。自動ロードに使用できる実際のアプリケーション コードは次のとおりです。

class Autoloader {
    private $class_map;

    public function __construct() {

        //you could also move this out of the class and pass it in as a param
        $this->class_map = unserialize(file_get_contents($file_you_wrote_to_earlier));
        spl_autoload_register(array($this, 'load'));
    }

    private function load($className) {
        //and now that we did all that work in the script, we
        //we just look up the name in the map and get the file
        //it is found in
        include $this->class_map[$className];
    }
}

これでできることは他にもたくさんあります。つまり、autoload リストの構築中に見つかった重複クラスなどのさまざまなことの安全チェック、ファイルを含める前にファイルが存在することの確認などです。

于 2012-10-11T17:28:01.380 に答える
2

doctrine クラスローダープロジェクトを試すことをお勧めします。

ここでは、公式ドキュメントを見つけることができます。

このライブラリを使用するには、名前空間をサポートするバージョンの php が必要です (>= 5.3)。

于 2012-10-11T15:53:06.373 に答える
1

Composer はすべての作業を行う場所であり、これらすべてを非常に簡単に実行します。

http://getcomposer.org/

于 2012-10-11T22:49:54.927 に答える