2

私は自分のライブラリの1つでPharアーカイブを作成しようとしています。libは、フォルダーとサブフォルダーに編成されたクラスの集まりです。ここにはindex.phpはまったくなく、オートローダーを開始するために呼び出す静的なConfigクラスだけです。

とにかく、私はこのようなアーカイブを構築しました:

$phar = new Phar(__DIR__ . '/lis.phar',0,'lib.phar');
$phar->buildFromDirectory(__DIR__ . '/class','/\.php$');
$phar->stopBuffering();

その後、私はこのようにpharを使用しようとしています:

require('lib.phar');
Config::register(); // Config is in the phar

しかし、次のエラーが発生します。

警告:include(phar:// D:\ wamp \ www_test \ phar \ lib.phar / index.php)[function.include]:ストリームを開くことができませんでした:pharエラー:"index.php"はpharのファイルではありません9行目のD:\ wamp \ www_test \ phar \ lib.pharの「D:/wamp/www/_test/phar/lib.phar」

index.phpファイルを含まないpharアーカイブを作成するにはどうすればよいですか?実際、アーカイブがファイルのコンテナである必要があり、何も自動実行する必要はありません。

4

1 に答える 1

1

まず第一に、私はあなたがstartBuffering()前にしなければならないと思いますstopBuffering()buildFromDirectoryそして、私はそれがあなたのためにこれを内部的に行うと思うかもしれません。stopBuffering()アーカイブを「封印」するために行う必要はありません。その準備ができている「オンザフライ」。

次に、次のようにdefaultStub(コードで暗黙的に使用される)を監視できます。

$phar->setDefaultStub();
var_dump($phar->getStub());

それは少し不可解ですが、あなたはそれを理解するでしょう。pharストリームラッパーのサポート(5.3)をチェックし、サポートしていない場合は、コンテンツを一時ファイルに抽出してから、Phar::START定数File(デフォルトでは「index.php」)を実行します。そしてもちろん、それはPhar::interceptFileFuncs()インクルードパスを実行して設定します。これにより、pharが「魔法」として機能します。しかし、あなたの質問はあなたがあなたのライブラリのためのアーカイブだけを必要とするように聞こえます。したがって、「PharData」クラスを使用する方がよいでしょう。まだ試していませんが、ドキュメントにはそう書かれています。

于 2011-11-03T08:13:22.110 に答える