2

名前空間のフォールバックと Composer での PSR-4 ローダーの使用に問題があります。

私がやろうとしていることはこれです:

  1. 上書き/拡張できるコアを持っています。
  2. コアはインターフェイスに基づいています。

ディレクトリ構造は次のようになります。

site/app/View/Example.php
site/src/ACME/app/View/Example.php
site/src/ACME/app/Interface/View.php

私はこの構成に設定されていないので、より良い提案があればそれを選択してください。

私の作曲家のjsonは、psr-4の場合は次のようになります。

 "autoload": {
    "psr-4": {
         "ACME\\App\\Site\\" : "app/",
         "ACME\\App\\" : "src/AMCE/app/"
    }
}

サイトが見つからない場合、これにより ACME\App\Site\View が ACME\App\View にフォールバックされると思いました (インターフェイス部分はまだ行っていないことに注意してください...)。

site/app/View/Example.php の私のコードは次のようになります:

namespace ACME\App\Site\View;

class ViewExample extends View {

site/app/View/View.php もある場合、これは機能します。次のようになります。

namespace ACME\App\Site\View;

class View extends \ACME\App\View\View {

site/src/app/View/View.php は次のようになります。

namespace ACME\APP\View;

class View {

これはインターフェイスを使用する必要があります(まだ試していません)。

だから私が本当にやりたいのは、site/app/View/View.php を持つ必要がないようにすることです。また、site/app/View/Example.php を持つ必要もありません。 /src/ACME/app/View/Example.php.

申し訳ありませんが、私は名前空間に慣れていないので、うまく言い表せないかもしれません。

私が得ているのは、 ACME\App\Site が ACME\App にフォールバックすると思っていたということです-そうではありませんか? それとも私はそれを間違っていますか?現時点では、すべてのファイルを配置する必要があります。

4

3 に答える 3

2

今のところすべてが混同されているため、少し分けてみましょう。

私がやろうとしていることはこれです:

  1. 上書き/拡張できるコアを持っています。
  2. コアはインターフェイスに基づいています。

これは基本的なオブジェクト指向の継承のように思えます。インターフェースは提案された公共の振る舞いを定義し、コアは必要な基本を実装し、詳細な実装は一部を変更し、他の部分を再利用します。

PHP が絶対ネームスペース名で認識できるように、コード例を書きましょう。

class \ACME\App\Site\View\ViewExample extends \ACME\App\Site\View\View {}

class \ACME\App\Site\View\View extends \ACME\App\View\View {}

class \ACME\App\View\View {}

明示的に名前が付けられた 3 つのクラスがあります。名前空間とクラス名に一致する 3 つのファイルが必要です。オートローディングでは、クラスが存在するかどうかを検出する必要はありません。存在しないクラスからオプションで継承したり、省略したりできないためです。

一方、デフォルトで 3 レベルの継承を実装するのは、多すぎる可能性があります。私には悪い設計のように見え、コードの保守が必要以上に難しくなります。達成したいことに応じて、より簡単に目的を達成するための選択肢がたくさんあります。たとえば、動作の細部を変更するには、デコレータ パターンまたは戦略パターンがあります。

だから私が本当にやりたいのは、site/app/View/View.php を持つ必要がないようにすることです。また、site/app/View/Example.php を持つ必要もありません。 /src/ACME/app/View/Example.php.

あなたはこれを持つことはできません。コードは から継承することを明示的に示している\ACME\App\Site\View\Viewため、このクラスはどこかに存在する必要があります。

これは、オートロードとは無関係です。実験として、すべてのコードを 1 つのファイルに追加して実行できます。これにより、すべてのクラスが PHP にすぐに認識されるようになり、問題が明らかになります。他のクラスが同時にクラスを継承している場合、そのクラスを削除することはできません。

申し訳ありませんが、私は名前空間に慣れていないので、うまく言い表せないかもしれません。

名前空間は特別なものではありません。PSR-0 スタイルのクラス名にアンダースコアを使用すると、同じ問題が発生します。

class ACME_App_Site_View_ViewExample extends ACME_App_Site_View_View {}

// This class MUST be present for the above class to work
class ACME_App_Site_View_View extends ACME_App_View_View {}

class ACME_App_View_View {}

名前空間の主な新機能は、use OtherNamespace\Classname. ただし、これはこのファイルのスコープ内のエイリアスにすぎません (つまり、他のファイルやグローバル スコープには影響しません)。

于 2016-02-23T00:32:49.200 に答える