0

私は何年もの間phpプログラマーでしたが、今はOOPに入ったばかりです。これまでのところ、ItemとListの2つのクラスがあります(ここでは単純化しただけで、実際のクラス名ではありません)。すべてのデータは、SOAPを使用してWebサービス経由でアクセスされます。

SOAPクライアントを取得し、それを複数のクラスで使用することを実装するのが最善の方法かどうかはわかりません。たとえば、WSDLはaddItem関数とgetList関数を定義します。また、トランザクションごとにサービスにトークンを送信する必要があります。

すべてのクラス内に新しいSoapClientを定義する必要がありますか?そのようです:

class Item {
  // item properties
  function addItem($itemName) {
     $client = new SoapClient('myfile.wsdl');
     $client->addItem($itemName);
     //service returns true or false
  }
}

class List {
  function getList($listName) {
     $client = new SoapClient('myfile.wsdl');
     return $client->getList($listName);
     //service returns array
  }
}

または、個々のクラスの外部に新しいSoapClientを作成し、それぞれで同じクライアントオブジェクトを使用する方法はありますか?

4

3 に答える 3

1

依存性注入を使用してコンストラクターに渡します。

class Item {

  function __constructor(SoapClient &$s){
      $this->soap = $s;
  }
  // item properties
  function addItem($itemName) {
     $this->soap->addItem($itemName);
     //service returns true or false
  }
}
于 2012-07-16T18:19:52.227 に答える
1

SoapClientの使用方法に応じて、いくつかのオプションがあります。

スクリプトの実行中にそのSoapClientを複数回使用する場合(そしてスレッドセーフですか?)、シングルトンパターンを使用してSoapClientのインスタンスをフェッチできます。これにより、オブジェクトのインスタンスを1つだけ作成し、必要になるたびに再度フェッチすることができます。

オブジェクトをフェッチするには、コードは次のようになります。

$soapclass = $SoapClassSingleton::getInstance()

そして後ろのクラスは次のようになります

class SoapClassSingleton{
private instance;
public static function getInstance(){
    if(!self::instance){            
        self::$instance = new SoapClass();          
    }
    return self::$instance;
}

これは「グローバル」変数を持つのとほとんど同じですが、必要な場合にのみ作成され、同じオブジェクトを他のクラスで使用できます。この設計を使用して、アプリケーションにログインします。

SoapClientのインスタンスを作成し、作成時にクラスに渡すこともできます。ヘルプについては、PHPのコンストラクターを参照してください。

または、クラスでSoapControllerを含むクラスを拡張することもできます。これを行うことの欠点は、スーパークラスと緊密に結合されていることです。

于 2012-07-16T18:26:24.110 に答える
-1

親愛なる、これを行うための非常に多くの可能な方法があります。スクリプトのすべての部分でまったく同じ状態を維持したい場合は、シングルトンクラスを使用できます。

アクセス:

MySoapConnection::instance()->function_calls_here

クラス:

class MySoapConnection {

  /* Singleton */
  private static $_instance;
  public static function instance()
  {
    if (! self::$_instance):
      self::$_instance = new self();
    endif;
    return self::$_instance;
  }


  function __constructor(SoapClient $s){
      $this->soap = $s;
  }
  // item properties
  function addItem($itemName) {
     $this->soap->addItem($itemName);
     //service returns true or false
  }
}

コメントが述べているように、私はテストしていません。また、このコードをコピーして貼り付けることもできません。シングルトンの例を示しています。これ以上、それ以下はありません。PHPはOOP用に構築されていません。私はPHPが大好きで、OOP用に構築されたのではなく、OOPを使用するように適合されました。

于 2012-07-16T18:23:56.893 に答える