3

私はOOPを初めて使用するので、かなり基本的な質問がありますが、簡潔に説明するのに苦労しているため、答えを探すのが難しいです。

クレジットカード処理をサポートするアプリケーションがあり、他のプロバイダー(linkpoint、authorize.netなど)を追加できるように処理機能を抽象化したいと考えています。私がやりたいのは、次のような単純なクラスを作成することだと思います。

class credit {

    function __construct($provider){
        // load the credit payment class of $provider
    }

}

次に、プロバイダーにそれぞれこのクラスを拡張してもらいます。

class linkpoint extends credit { }

しかし、私は本当にクレジットクラスをインターフェースのようなものとして使いたいと思っています。クレジットオブジェクトは必要ありません。次のようなことをしたいと思います。

$credit = new credit('linkpoint');

次に、$creditをリンクポイントクラスのインスタンスにします。または、少なくとも、すべてのメソッドでリンクポイントクラスで定義されたコードを実行する必要があります。

それにアプローチするための最良の方法は何ですか?それともそれを行うためのより良い方法はありますか?

4

4 に答える 4

5

これは「ファクトリパターン」と呼ばれます(デザインパターンも参照) 。

あなたはそれをこのように扱うことができます

class Credit
{
  public function __construct($factory)
  {
    $object = null;

    switch($factory) {
      case 'linkpoint':
        $object = new linkpoint();
        break;
      case 'xy':
        //...
    }
    return $object;
  }
}
于 2012-05-10T17:34:57.917 に答える
4

これが正しいかどうかはわかりませんが、$ creditをリンクポイントのインスタンスにしたい場合は、次のことを行う必要があります。

$linkPointCredit = new linkpoint();

ところで。クラス名は常に大文字で始める必要があります。

アップデート:

そうすれば、実際にファクトリパターンを使用できます。

class Credit
{
    private $provider;

    public function __construct($provider)
    {
        if(class_exists($provider) {
            $this->provider = new $provider();
        }
    }
}
于 2012-05-10T17:34:19.087 に答える
1

あなたが説明したことは、ファクトリデザインパターンのように聞こえます。コンストラクターを使用する代わりに、Credit渡された文字列に応じて、サブクラスの1つのインスタンスを返すクラス(静的)メソッドが基本クラスにあります。

于 2012-05-10T17:36:08.167 に答える
0

「ディペンデンシーインジェクション」をお勧めします。

class credit {

    function __construct(Provider $provider)
    {
        $this->setProvider($provider);
    }

}

class Provider {}
class Linkpoint extends Provider {}
class crossave extends Provider {}
class Debitcentral extends Provider {}

次に、次のように使用できます。

$linkpoint = new Linkpoint();
$credit = new Credit($linkpoint);

$crossave = new Crossave();
$credit = new Credit($crossave);

$debitcentral = new Debitcentral();
$credit = new Credit($debitcentral);
// etc...
于 2012-05-10T17:38:47.357 に答える