web-dev-qa-db-ja.com

カスタムcomposer名前空間がクラスを見つけられません

個人クラスにカスタム名前空間を使用しようとしています。

ディレクトリ構造は(いつものように):

 my_project/
-src/
|-myComponent.class.php
\-myWrapper.class.php
-ベンダー
 | -OtherLibrary 
 \-Symfony 
-composer.json 
-index.php 

私のcomposer.json私は自分の名前空間を次のように指定します:

_"autoload": {
    "psr-0": {
        "my_namespace\\": "src/"
    }
}`
_

次に、私のPHPコードでは、次のようなものがあります。

myComponent.class.php

_namespace my_namespace;

class myComponent
{
 .... code
}
_

index.php

_namespace my_namespace;

require_once __DIR__.'/vendor/autoload.php';

$component = new myComponent();
_

これを実行すると、次のようになります。

致命的なエラー:5行目の/path_to_root/my_project/index.phpにクラス 'my_namespace\myComponent'が見つかりません

ながら...

  • myComponentmy_project/src /の下で検索されることを期待します。 composer.jsonで指定され、vendor/composer/autoload_namespaces.php'my_namespace\\' => array($baseDir . '/src'))。

  • 名前空間を自分の名前空間に定義するときは、カスタムmyComponentを直接呼び出すことを期待します。私が間違っている?

私のコードと私の仮定の何が問題になっていますか?どうすれば修正できますか?

12
Kamafeather

自分でエラーを見つけましたが、Composerの便利なautoloadディレクティブの機能を簡単にまとめました:

  1. PSR-0は、クラス名をパス名に変換し(名前空間のアンダースコアとバックスラッシュはディレクトリ区切り文字に変換されます)、末尾に「.php」を追加し、composer.jsonで指定したパスでこのファイルを見つけようとします。ファイル。クラスmyNamespace\myClass"psr-0":{"myNamespace\\": "src"}src/myNamespace/myClass.phpを読み込もうとします。
  2. PSR-4は名前空間でのみ機能します。 composer.jsonで指定された名前空間プレフィックスを完全なクラス名から削除し、残りをパスに変換し、最後に「.php」を追加して、指定されたパスで検索します。クラスmyNamespace\myClass"psr-4":{"myNamespace\\": "src"}src/myClass.phpを読み込もうとします。
  3. クラスマップの自動ロードは、すべてのファイルをスキャンしてクラス、インターフェイス、および特性(自動ロードできるすべてのもの)を探し、その配列マップをコンパイルすることで機能します。これは、任意のファイル名スキーマと任意のディレクトリレイアウトで機能しますが、新しいクラスを追加するたびにマップを更新する必要があるため、回避するようにしてください。また、インストール中にファイルをスキャンするのに時間がかかり、そのマップをロードして保持するのにいくらかのCPUとメモリが必要です。
30
Sven