8

親クラスの戻り型のサブクラスを返す必要があるサブクラスがあります。これは共変リターン型と呼ばれていると思います。親クラスから子クラスに変換する最も簡単な方法を考えています。

class A {
}
class B extends A {
  function bar() {
  }
}

class Car {
  function foo() {
    return new A();
  }
}

class BrokenCar extends Car {
  function foo() {
    $a = parent::foo();
    //What is the cleanest way to convert $a to type B ?
  }
}
4

3 に答える 3

8

PHPでは、言語で使用可能な機能を使用して、オブジェクトをタイプ/クラスAからBに「変換」することはできません。

ただし、オブジェクトがシリアル化をサポートしている場合は、シリアル化を利用することでこれを行うことができます(通常、プレーンな古いPHPオブジェクトはシリアル化をサポートします)。シリアル化された形式では、オブジェクトのクラスを変更して、再度シリアル化を解除します。その時、AはBに変わりました。しかし、それは本当に流暢ではありません。

于 2011-08-19T15:12:26.170 に答える
3

これは実際にはコメントになるはずですが、重要な点を述べておきます。

プログラミングはエンジニアリングであり、プログラミングはデザインです。デザインAがデザインBよりも優れている理由を、それがどのように使用されるかを知らずに判断する方法はありません。デザイナーに、送信ボタンを赤にするか緑にするかを尋ねます。彼女はこう言います。うーん、どこで、どのサイトに?ビームまたはギアクーピングを使用する必要があるかどうかをエンジニアに尋ねてください。答えは次のようになります。したがって、「foo」メソッドを持つ「BrokenCar」クラスのみを提供した場合、意味のある設計アドバイスを提供できると思われる理由は何ですか。それで実際に達成したいことを教えてください。さもなければ、私が思いつくことができる唯一の答えは

fooを使用する最良の方法はbarです

于 2011-08-19T15:22:07.300 に答える
2

hakre述べたように、ユーザー定義型へのキャストはPHPではネイティブには不可能です(私が知る限り)。

あなたができることは、クラスAまたはBのいずれかにメソッドを作成することです。

class A
{
    public static function fromB( B $object )
    {
        /* your routine to convert an object of class B to an instance of class A */
    }

    /* or */

    public static function fromA( A $object )
    {
        /* your routine to convert any object that is a subclass of A to a concrete instance of class A */
    }
}

また

class B
    extends A
{
    // this method could even be implemented in A already as well actually
    public function toA()
    {
        /* your routine to convert this object to an object of class A */
    }
}

最初の例では、Aが特定のサブクラスに関する具体的な知識を持っている必要があるため、最初のファクトリメソッドは問題になる可能性があります。これが自分の状況で望ましいかどうかを判断する必要があります。おそらく、これを抽象化して、2番目のファクトリメソッドのように、ファクトリメソッドがAから継承するすべてのオブジェクトを受け入れるようにすることができます。

2番目の例では、BはAを継承しているため、Aを自動的に認識しています。これはより望ましいかもしれません。しかし、考えてみると、これはすでにAにも実装されている可能性があり、その結果、メソッドはすでにAのすべてのサブクラスで自動的に使用可能になります。

于 2011-08-19T15:39:21.133 に答える