繁体   English   中英

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(并且它是线程安全的吗?),则可以使用单例模式来获取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的类。 这样做的缺点是现在您已经与超类紧密结合。

亲爱的,有很多方法可以做到这一点。 如果要在脚本的所有部分中保持相同的名称,则可以使用单例类。

访问:

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
  }
}

如评论所述,我尚未测试。 您也不应复制/粘贴此代码。 仅显示一个Singleton示例。 没事,没事。 PHP不是为OOP构建的,我很喜欢PHP,它被适配为使用OOP,而不是为此而构建的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM