2017-01-24 11 views
0

私はPSR-0を自動読み込みに使用していますが、私はPSR-4を使用する必要があることを知っています。 PSR-4でも答えは歓迎です。PHPオートロードでエラーが発生する

自動ローディングがうまく機能する次のディレクトリ構造を持っています。次のディレクトリ構造については

+ www/entity 
|__ /EntityGenerator 
|  |__ /Database 
|  |  |__ DatabaseConnection 
|  |  |__ DatabaseConnectionInterface 
|  |  |__ DatabaseRepositoryInterface 
|  |  
|  |__ /Exception 
| 
|__ autoload.php 
|__ index.php 

その次のようにエラーを与えて

警告:ストリームをオープンに失敗しました:Cでそのようなファイルまたはディレクトリ:(EntityGeneratorの\ DatabaseConnection.phpは\データベース)が必要です\ WAMP私は第2のディレクトリ構造のエラーを取得していますなぜ\ライン15

+ www/entity 
| __ /EntityGenerator 
     |__ /Database 
     |  |__ DatabaseConnection 
     |  |__ DatabaseConnectionInterface 
     |  |__ DatabaseRepositoryInterface 
     |  
     |__ /Exception 
     |__ autoload.php 
     |__ index.php 

上のWWW \エンティティ\ EntityGenerator \ autoload.php誰もが説明できます。

誰がテストのために全体のコードを必要とする場合、それはディレクトリ構造ためだ

https://github.com/channaveer/EntityGenerator

+0

あなたが全体のコードにリンクすることになっていません。 **あなたの質問に**関連するコード**を含めることになっています。最も注目すべきことは、あなたのautoload.phpを見ることが非常に役に立ちます。 –

+0

@Franz実際に私はそれを計画していましたが、時には私のコードリンクを追加するために実際に私が探しているものを混乱させるかもしれません。とにかく将来はオープンソースになるでしょう。ありがとう。 –

+1

これは私だけですか、またはオートローディング時に相対パスのみを使用しますか?もしそうなら、それは大きなノーではありません。 – apokryfos

答えて

1

問題は現在のスクリプトのディレクトリとして設定されているとは限りません。ロードする必要があるものを確実にロードするには、絶対パスを使用する必要があります。

function autoload($className) 
{ 
    $namespaceRoot = "EntityGenerator"; 
    $className = ltrim($className, '\\'); 
    if (strpos($className,$namespaceRoot) !== 0) { return; } //Not handling other namespaces 
    $className = substr($className, strlen($namespaceRoot)); 
    $fileName = ''; 
    $namespace = ''; 
    if ($lastNsPos = strrpos($className, '\\')) { 
     $namespace = substr($className, 0, $lastNsPos); 
     $className = substr($className, $lastNsPos + 1); 
     $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; 
    } 
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; 
    require __DIR__.DIRECTORY_SEPARATOR.$fileName; //absolute path now 
} 
spl_autoload_register('autoload'); 

__DIR__は、現在のスクリプトが入っているディレクトリを返すことが保証される。

+0

私はあなたの変更を試してみましたが、自動ロード "C:\ Wamp \ www \ entity \ EntityGenerator \ EntityGenerator \ Database \ DatabaseConnection.php"にエコーしたときに次のようになりました。今でも2つの構造で同じ問題があります。エラーは次のとおりです。 "警告:(C:\ wamp \ www \ entity \ EntityGenerator \ EntityGenerator \ Database \ DatabaseConnection.php):ストリームのオープンに失敗しました。あなたはそれで私を助けてくれますか? –

+0

@ChannaveerHakariあなたの問題は、オートローダをネームスペースの中に移動したことです。通常、オートローダーは名前空間の外に常駐します。しかし、あなたはそれを修正することができますので、ルート名前空間を指定して、あなたが既に入っているディレクトリ。更新されたコードを確認してください – apokryfos

+0

ありがとうございました。ちょうど異なった方法を知りたかった。あなたの答えがわかりました –

1

以下のリンクを見つけてください。 EntityGenerator \ Database \ DatabaseConnectionを読み込もうとしています。最初の例ではパスと一致しますが、2番目のパスでは一致しません。 autoload.phpからのパスを見てください。それはその道にある道を探しています。 EntityGeneratorは、autoload.phpのパスであるwww/entity内の有効なパスです。ただし、2番目の例ではwww/entity/EntityGeneratorでは使用できません。

+0

自動ロード機能のパスをエコーすると、両方のディレクトリ構造が同じパスを示します。あなたの意見は? –

+0

パスは正しいはずですが、autoload.phpはそのパスにアクセスできません。これは、autoload.phpのパスがwww/entity/EntityGeneratorにEntityGeneratorパスがないためです。 2番目の例でautoload.phpの近くにファイルを置き、 "echo"から取得するパスが必要です。あなたは何が間違っているのを見るでしょう。そしてもし可能であれば、require/includeのために絶対パスを使うようにしてください。 –

関連する問題