Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP-在其他类中使用对象_Php_Oop - Fatal编程技术网

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

PHP OOP-在其他类中使用对象,php,oop,Php,Oop,我做php程序员已经很多年了,但现在才开始接触OOP。到目前为止,我有两个类,Item和List(这里我只是简化一下,它们不是真正的类名)。我所有的数据都是通过使用SOAP的web服务访问的 我不确定实现获取SOAP客户机并在多个类中使用它的最佳方法是什么。例如,WSDL定义了一个addItem函数和一个getList函数。我还需要为每个事务向服务发送令牌 我是否需要在每个类中定义一个新的SoapClient?像这样: class Item { // item properties fu

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

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

访问:

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而构建。

根据您使用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的实例,并在创建时将其传递到类中。请参阅PHP的构造函数以获取帮助


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

您的类应该有一个
SoapClient
类型的成员变量。嗯,单例是uuuugly。我同意Neal,但在PHP中。。。。哎呀,太难看了。但是,Singleton在这里完成了任务。:)哈哈,这根本不是真的。如果您没有将
SoapClient
传递到Singleton,这也将失败!Psh。PHP OOP是好的,只要你不去尝试做愚蠢的事情。@Rastapoulous:构造函数不返回任何东西——它们只是构造。至于选择SoapClient,这是一种设计决策;我认为应该这样做,除非它封装了建立连接的所有功能和一切(并且永远不需要设置不同的SOAP客户端)。在这种情况下,您可能会遇到SRP问题。依赖注入肯定是首选,但是
和$s
有什么意义呢?
SoapClient
实例已通过引用传入…@rdlowrey是吗?我不知道。@KarolyHorvath记录在哪里?@Neal出于所有意图和目的,是():那么,在本例中,我是否在其他地方调用类似于
$s=new SoapClient()
的东西,然后将
$s
传递到类构造函数中?