我已经成为一名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并在每个类中使用相同的客户端对象?
答案 0 :(得分:1)
通过一些依赖注入将它传递给构造函数:
class Item {
function __constructor(SoapClient &$s){
$this->soap = $s;
}
// item properties
function addItem($itemName) {
$this->soap->addItem($itemName);
//service returns true or false
}
}
答案 1 :(得分:1)
根据您使用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的类。这样做的缺点是,现在你与超类紧密结合。
答案 2 :(得分:-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
}
}
正如评论所述,我还没有测试过。你也不应该复制/粘贴这段代码。只显示一个Singleton示例。没有更多,没有更少。 PHP不是为OOP而构建的,我喜欢PHP,它适合使用OOP,而不是为它而构建。