【问题标题】:PHP OOP - using an object inside other classesPHP OOP - 在其他类中使用对象
【发布时间】:2012-07-15 15:29:23
【问题描述】:

我从事 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 并在每个类中使用相同的客户端对象?

【问题讨论】:

  • 你的类应该有一个SoapClient类型的成员变量。

标签: php oop


【解决方案1】:

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

class Item {

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

【讨论】:

  • 依赖注入绝对是首选,但&$s的意义何在? SoapClient 实例已经通过引用传入...
  • @rdlowrey 是吗?我不知道。
  • @KarolyHorvath 记录在哪里?
  • @Neal 出于所有意图和目的,是的 (relevant manual entry):
  • 那么在这种情况下,我是不是在其他地方调用$s = new SoapClient() 之类的东西,然后将$s 传递给类构造函数?
【解决方案2】:

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

访问:

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

正如 cmets 所说,我还没有测试过。您也不应该复制/粘贴此代码。仅显示一个单例示例。不多,不多。 PHP 不是为 OOP 构建的,我喜欢 PHP,适应使用 OOP,不是为它构建的。

【讨论】:

  • Ummmm Singletons 是 uuuugly。
  • 我同意 Neal,但在 PHP 中……OOP 很丑。然而,Singleton 在这里完成了工作。 :)
  • 哈哈,这根本不是真的。这也将失败您没有将SoapClient 传递给Singleton!
  • 嘘。 PHP OOP 没问题,只要你不去尝试做愚蠢的事情。
  • @Rastapopulous:构造函数不返回任何东西——它们只是construct。至于采用 SoapClient,这是一个设计决定。我会说它应该,除非它封装了建立连接的所有功能和所有内容(并且永远不需要设置不同的 SoapClient)。在这种情况下,您可能会遇到 SRP 问题等着给您带来问题。
【解决方案3】:

根据您使用 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 的类。这样做的缺点是现在您与超类紧密耦合。

【讨论】:

    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2014-10-08
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多