2010-02-10 55 views
1

我在寫一個SOAP服務器並遇到了一個奇怪的問題。PHP中的SOAP服務器錯誤 - 添加類中的函數

下面是來自server.php

class MyHandler { 
    public function __construct() { ... } 
    public function __wakeup() { ... } 

    public function getPrice() { ... } 
} 

$server = new SoapServer("my.wsdl", array("soap_version" => SOAP_1_2)); 

$server->setClass('MyHandler'); 
$server->addFunction("getPrice"); 
$server->handle(); 

測試這個本地(在PHP 5.3)相關線路工作正常,我可以發送請求和接收響應。

當我把這個在我的開發服務器(PHP 5.2.9),我得到這個錯誤信息:

SoapServer::addFunction(): Tried to add a non existant function 'getPrice'

除了一個事實,即他們不能拼,這非常混亂。

我一直以來設法改變addFunction()線,這對解決此問題:

$server->addFunction(SOAP_FUNCTIONS_ALL); 

...它工作正常!當然,檢查$server->getFunctions()表明,這也增加了我的課程中的__construct()__wakeup()函數,這似乎並不是一件好事。

我做錯了什麼?地毯炸彈是「添加所有功能」的方法嗎?

回答

5

使用addFunction()告訴它尋找一個名爲getPrice()其功能自己,在一個班級之外。這不存在,所以導致錯誤。

使用addClass()會自動添加MyHandler的所有功能,所以您不需要撥打addFunction(),getPrice()應該已經添加。

此外,還有一個開放的車票(對於PHP 5.2.9)上bugs.php.net這似乎表明,有沒有添加使用addFunction()一類方法的方式:http://bugs.php.net/bug.php?id=47919

我用不上到PHP 5.3的,所以不知道如何事情可能會改變我怕......

0

嗯,不知道爲什麼它在PHP 5.3上工作,但據我所知,SoapServer::setClass()導出給定類中的所有方法(即,將使用該方法導出您的getPrice()方法)。

SoapServer::addFunction()特別適用於井功能。你有任何機會在你的本地環境中存在一個流浪的getPrice()函數?

您可以通過註釋掉addFunction()調用來測試此操作,該調用仍應顯示從「MyHandler」導出的方法。

使用SOAP_FUNCTIONS_ALL可能是一個糟糕的主意,因爲如果你刪除setClass()調用它實際上導出所有PHP函數出於某種原因...

+0

不,我確定沒有包含額外的函數:腳本中只包含一個include(包括MyHandler類),甚至包含的內容都粘貼到腳本中,沒有區別。 – nickf 2010-02-10 06:54:05

+0

您是否嘗試刪除addFunction()調用?無論如何,setClass()應該足以導出類中的所有方法。 – Owen 2010-02-10 07:01:31

1

$server->addFunction(array("SOAPMethods", "getPrice"));

0

我使用的PHP版本5.3.10和我有同樣的問題。我通過添加array關鍵字來解決它。

前:

$server->addFunction("functionName"); 

後:

$server->addFunction(array("functionName")); 

參考:PHP SoapServer::addFunction documentation