2012-04-29 6 views
4

私はSymfonyクラスローダを少し演奏しています(他の人のことを読んで、コンセプトを実装し始めました)。Symfonyクラスローダ - 用法実際の使用法の例はありません

私はhttp://symfony.com/doc/current/components/class_loader.htmlも読んでいます 私はディレクトリ構造をすべてに合わせて変更しました。ここで失敗した小型のソース・コードは次のとおりです。

ファイル名:test.phpを、ディレクトリ: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; 
} 
+0

あなたのエラーは何ですか?どの情報が具体的に文書から抜けていますか? (ドキュメントの要求はやや広範で、他の人は他の情報が欠けている)。 – hakre

+0

私はそれをソースのコメントとして書いています://致命的なエラー:Class 'Pimple'が..pathに見つかりません。文書内の 私は実際の使用法がありません。 Shoudl私は:または直進 "新しい)"を使用してください。静的なクラスなどの場合はどうすればいいですか。 私は同意します、私はそれについて明確ではありませんでした。私はこの種の使い方は簡単だとは思っていましたが。 – user1271518

+1

useステートメントにはクラス名を追加する必要があります。\ Pimpleを使用することは正しいと思われます。おそらく\ Pimple \ Pimpleを使用しますか? – ilanco

答えて

11

。ファイル/ディレクトリ名では大文字と小文字が区別されます。

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

あなたはあなたのために動作するはずのコードを、次のあなたの現在のディレクトリ構造を維持したい場合は、次の例のSRCのために、

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

私はむしろ一つの共通のディレクトリにソースコードを置くところ:

src/ 
    App/ 
    Location/ 
     Location.php 

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

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

これを行うと簡単ですオートローダに、srcフォルダのApp名前空間クラスを探すべきことを伝えます。 App名前空間のすべてのクラス(PSR-0に続いて)で動作することに注意してください。

これまで、私はSymfonyオートローダーに関するブログ記事を書いていました。それは役に立ちます:Autoloading classes in an any PHP project with Symfony2 ClassLoader component

あなたはPimpleを使用する予定であり、SymfonyコンポーネントのいくつかはSilex microframeworkを見ています。あなたが実装する必要があるかもしれません。

+1

明確で建設的な答えをありがとう。それだけでした。あなたは私が間違っていたことを理解するのを手伝ってくれました。それを修正し、私にさらなるツールを指摘しました。 – user1271518

+0

とBTW:Symfonyオートローダを使ってPimpleを読み込めます。 –

+0

Tnx!どのようにそれを正しく行うには? :) – user1271518

2

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

にきびのためPimple名前空間を登録するには役に立ちませんPimpleはデフォルトネームスペースの1つのクラス(ネームスペースはありません)です。

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

Explicit Note:You are using the wrong tool to do the job. All file layouts you have shared over the last hours are incompatible with UniversalClassLoader .

パラメータの値が間違っていれば、クラスは機能しません。

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

オートローダがLocation/Location/App/Location/Location.phpファイルにApp\Location\Locationクラスを探します:次のようにあなたの名前空間を登録することにより

+0

いずれの方法でも、自動ローダー機能を使用する場合は、すべて同じ方法で使用することをお勧めします。 Pimpleのためには機能しません。 \ APP \ Location \ Locationを使用してください。 新しい¥APP¥Location¥Location(); 私に教えてください: 致命的なエラー:クラス 'APP \ Location \ Location' – user1271518

+0

あなたはここでの名前空間の理解に間違っていると思います。 https://github.com/symfony/ClassLoader/blob/master/UniversalClassLoader.php#L14 - PimpleはPSR-0 *でもPEARにも対応していません。技術的には、 'UniversalClassLoader'はそのライブラリの間違ったクラスローダです。 – hakre

+0

私はソースをちょっと調べましたが、それは私を助けませんでした:/ 名前がスペースではないので、ピンプルはPSR-0互換ではないことを知っています。(それはグローバルでなければなりません)、そうではありませんアンチパターン。 いずれにしても、私はLocationクラスでテストを行い、パスにrequireを追加しました。それだけです: 名前空間App \ Location; class Location {// implementation} クラスの中で最も単純なもの... – user1271518

関連する問題