PHP OOP-在其他类中使用对象


PHP OOP - using an object inside other classes

我做php程序员已经很多年了,但现在才进入OOP。到目前为止,我有两个类,Item和List(我只是在这里简化,它们不是真正的类名。)我所有的数据都是通过使用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,并在每个类中使用相同的客户端对象?

通过一些依赖注入将其传递到构造函数:

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

根据SoapClient的使用方式,您有几个选项。

如果要在脚本执行期间多次使用SoapClient(而且它是线程安全的?),则可以使用singleton模式来获取SoapClient的实例。这将允许您只创建对象的一个实例,然后在每次需要时再次获取它

要获取对象,代码将是这样的。

$soapclass = $SoapClassSingleton::getInstance()

后面的班级看起来像

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

这几乎就像有一个"全局"变量,但只有在需要时才会创建,然后其他类可以使用同一对象。我使用这种设计来登录我的应用程序。

您还可以创建SoapClient的一个实例,并在创建它时将其传递到Class中。有关帮助,请参阅PHP的构造函数。

或者,您的类可以扩展包含SoapController的类。这样做的缺点是,现在您与超类紧密耦合。

天哪,有很多可能的方法可以做到这一点。如果你想在脚本的所有部分保持完全相同。。。您可以使用singleton类。

访问:

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,而不是为它而建的。