私は長い間PHPを使用して目的を達成するための正しいデザインを見つけようとしてきましたが、試したことはすべて失敗しました.おそらく正しい角度から見ていないためだと思います.あなたの何人かが私を啓発し、私に良いアドバイスをくれることを願っています!
最初は少し奇妙に見えるかもしれませんが、複雑にするのが好きだからではありません。簡単にするために、実際のコードではなく、問題の最小限の構造のみを示しています。それはこれらから始まります:
<?php
// ------------------------------------------------------------------------
class Mother_A
{
const _override_1 = 'default';
protected static $_override_2 = array();
public static function method_a()
{
$c = get_called_class();
// Uses $c::_override_1 and $c::$_override_2
}
}
// ------------------------------------------------------------------------
class Mother_B extends Mother_A
{
public function method_b()
{
// Uses self::method_a()
}
}
クラスMother_A
は、定数と静的を使用して子によってオーバーライドされる静的メソッドを定義します。これにより、派生クラスでジェネリック メソッド (「テンプレート」メソッドに相当) を定義できますMother_B
。どちらもMother_A
インスタンスMother_B
化することを意図していMother_B
ませんが、抽象的であってはなりません。これはレイト スタティック バインディングを悪用しますが、これは非常に便利だと思います。
今私の問題が来ます。n個の異なる「状況」(状況1、状況2など)で2つのクラスを定義したい:
<?php
// ------------------------------------------------------------------------
class Child_A_Situation_k extends Mother_A
{
// Uses method_a
}
// ------------------------------------------------------------------------
class Child_B_Situation_k extends Mother_B
{
// Uses method_a and method_b
}
もちろん、私は実際にこれらのばかげた名前を付けているわけではありません。Mother_A
両方のクラスはそれぞれの状況で異なる名前を持っていますが、どちらもとからの同じ派生パターンに従いますMother_B
。ただし、個々のケース (「状況」) では、両方のクラスでまったく同じ定数/静的オーバーライドが必要であり、両方のクラスでオーバーライドを手動で複製せずにそれを行う方法がわかりません。
私は多くのことを試しましたが、最も近いものはInterface_Situation_k
、状況 k の定数と静的を定義するインターフェースを実装し、両方の子にこのインターフェースを実装させることでした。もちろん、インターフェイスで静的を定義することはできないため、失敗しましたが、アイデアはわかります。インターフェイスをクラスと交換したでしょうが、PHP には多重継承がないため、どちらも有効ではありません。:/ 私は本当に立ち往生しており、可能な解決策を読むのが待ちきれません! 前もって感謝します!