2012-07-16 96 views
0

我是一個PHP程序員了數年,但現在才進入OOP中的對象。目前我有兩個類,Item和List(我只是在這裏簡化,它們不是真正的類名)。我所有的數據都是通過使用SOAP的Web服務訪問的。PHP OOP - 使用其他類

我不知道最好的辦法是實現讓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

你的類應該有一個'SoapClient'類型的成員變量。 – JonH 2012-07-16 18:20:01

回答

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

依賴注入絕對是首選,但是'&$ s'的含義是什麼?'SoapClient'實例已經通過引用傳入... – rdlowrey 2012-07-16 18:28:15

+0

@rdlowrey是它嗎?我不知道。 – Neal 2012-07-16 18:28:49

+0

自PHP 5以來的所有對象... – 2012-07-16 18:30:04

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

作爲意見狀態,我沒有測試過。你也不應該複製/粘貼這段代碼。只是顯示一個單例的例子。沒有更多,沒有更多。 PHP不是爲OOP構建的,我喜歡PHP,適應了使用OOP,而不是爲它構建。

+0

Ummmm Singletons uuuugly。 – Neal 2012-07-16 18:25:23

+0

我同意尼爾,但在PHP .... OOP是醜陋的。然而,辛格爾頓在這裏完成了這項工作。 :) – CrazyVipa 2012-07-16 18:26:02

+1

大聲笑,這是不正確的。這也會**失敗**你沒有將'SoapClient'傳遞給Singleton! – Neal 2012-07-16 18:26:33

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的實例,並把它傳遞到類,當您創建它。請參閱PHP的構造函數以獲得幫助。

或者你的類可以擴展包含SoapController類。這樣做的缺點是,現在你與超類緊密結合。