ホームページ  >  に質問  >  本文

依存関係を変更せずに内部で使用される PHP クラスを拡張する

Laravel で PHP クラスをオーバーライドしたいのですが、このクラスは他のいくつかのクラスによって拡張されているため、面倒にはなりたくないのです。全体的な構造は次のとおりです

リーリー

ここで、A/B/C/D/R は外部パッケージ内のすべてのクラスです。

これらのファイルを変更せずに A/B/C/D を P に拡張したいと考えています (これはメンテナンスの負担になります)。したがって、P クラスは R を拡張します。 。したがって、P クラスに追加を行うことができます。

私はオートローダーに接続できるようにする class_alias() を調べてきました。これにより、クラス P が正しくロードされます。

私が使用したコードは次のとおりです:

リーリー リーリー

しかし、エラーが発生しました:

ErrorException: 名前はすでに使用されているため、クラス #R を宣言できません

クラスの完全なファイル内容がコピーされるのを防ぎながら、内部 PHP クラスを拡張できるソリューションを探しています。それができるかどうかさえ分かりません。拡張したいクラスは Laravel サービス コンテナに適合しないため、機能を追加するファーストパーティの方法はありません。

P粉278379495P粉278379495306日前338

全員に返信(1)返信します

  • P粉189606269

    P粉1896062692024-01-11 00:08:07

    class_alias だけでは十分ではありません。P が R を拡張するには、両方のクラスが存在する必要があるからです。また、class_alias はオートロードとは何の関係もなく、2 つの名前を持つクラスを宣言するだけです。

    実際に必要なのは、実際のクラス R を新しい名前で定義し、次に独自のクラスを R という名前で定義することです (実際には class_alias は必要ありません)。

    1 つのアプローチは、以下に示すように、ターゲット クラスのソース コードを動的に書き換えてから、変更したコピーをロードすることです (未テスト)。 リーリー

    重要なことに、これは、通常のオートローダーがクラスの定義を試みる前に実行する必要があります。たとえば、

    $prepend オプションを true に設定して spl_autoload_register を使用できます。

    返事
    0
  • キャンセル返事