4

私はSymfonyクラスローダーで少し遊んでいます(他の人、概念について読んで、実装を始めました)。

http://symfony.com/doc/current/components/class_loader.htmlも読みました。また、ディレクトリ構造をすべてに合うように変更しました。失敗する小さなソースコードは次のとおりです。

ファイル名:test.php、dir:C:/test/BE/src/main.php

   <?php
    define('BASE_DIR','/../..');

    echo BASE_DIR.'/BE/libs/symphony/component/ClassLoader/2.1.0/UniversalClassLoader.php';
    require_once BASE_DIR.'/BE/libs/symphony/component/ClassLoader/2.1.0/UniversalClassLoader.php';

    use Symfony\Component\ClassLoader\UniversalClassLoader;

    $loader = new UniversalClassLoader();
    $loader->registerNamespace('App\Location\Location', 'Location/Location');

     // You can search the include_path as a last resort.
    $loader->useIncludePath(true);    
    $loader->register();
    use App\Location\Location;
    new App\Location\Location(); //Fatal error: Class 'App\Location\Location' not found in C:/test/BE/src/main.php

ファイル名:Location.php、ディレクトリ:C:/test/BE/src/Location/Location.php

namespace App\Location;

class Location{
    private $lat;
    private $lng;
}
4

2 に答える 2

11

次のように名前空間を登録します。

$loader->registerNamespace('App\Location\Location', 'Location/Location');

App\Location\Locationオートローダーはファイル内のクラスを探しLocation/Location/App/Location/Location.phpます。ファイル/ディレクトリ名では大文字と小文字が区別されることに注意してください。

の最初のパラメータregisterNamespace()は、名前空間または名前空間の一部です。2番目のパラメーターは、PSR-0準拠のライブラリーへのパスです。つまり、そのパス内のディレクトリ構造はPSR-0標準に従う必要があります。このパス、特定の名前空間のパスを計算するときに使用されません。

現在のディレクトリ構造を維持したい場合は、次のコードが機能するはずです。

$loader->registerNamespace('App', __DIR__);

ソースコードを1つの共通ディレクトリ(たとえば、src)に配置したいと思います。

src/
  App/
    Location/
        Location.php

次に、次のように名前空間を登録します。

$loader->registerNamespace('App', 'src');

そうすることで、オートローダーにsrcフォルダーでApp名前空間クラスを検索するように指示するだけです。App名前空間(PSR-0に続く)のすべてのクラスで機能することに注意してください。

少し前に、Symfonyオートローダーについてのブログ投稿を書きました。あなたはそれが役に立つかもしれません:Symfony2ClassLoaderコンポーネントを使ったPHPプロジェクトのクラスの自動ロード

PimpleといくつかのSymfonyコンポーネントを使用することを計画しているので、Silexマイクロフレームワークを見てください。それはあなたが実装する必要があるものかもしれません。

于 2012-04-29T13:22:34.240 に答える
2

あなたが使う:

$loader->registerNamespace('Pimple', BASE_DIR.'/BE/libs/Pimple/1.0.0/lib/Pimple');

PimplePimpleはデフォルトの名前空間の1つのクラスであるため(名前空間がないため)、Pimpleの名前空間を登録することは無意味です。

UniversalClassLoader、PSR-0およびPEAR互換のディレクトリレイアウトでのみ機能します。レイアウトが機能しない場合は、機能することを期待したり、互換性のないレイアウトで機能することを文書化することはできません。

明示的な注意: あなたは仕事をするために間違ったツールを使用しています。過去数時間に共有したすべてのファイルレイアウトは、と互換性がありませんUniversalClassLoader

それとは別に、パラメータに間違った値を指定すると、クラスは機能しなくなります。

于 2012-04-29T09:41:57.577 に答える