我正在编写一个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()
函数,这似乎不是一件好事。
我做错了什么?地毯炸弹“添加所有功能”是唯一的方法吗?
答案 0 :(得分:5)
使用addFunction()
告诉它在类之外单独查找名为getPrice()
的函数。这不存在,因此导致错误。
使用addClass()
会自动添加MyHandler
的所有功能,因此您无需致电addFunction()
,getPrice()
应已添加。
此外,在bugs.php.net上有一个打开的票证(对于PHP 5.2.9),这似乎表明无法使用addFunction()
添加类方法:http://bugs.php.net/bug.php?id=47919
我无法访问PHP 5.3,所以不确定事情是如何改变的我恐怕......
答案 1 :(得分:2)
$server->addFunction(array("SOAPMethods", "getPrice"));
答案 2 :(得分:0)
嗯,不知道为什么它在PHP 5.3上工作,但根据我的理解,SoapServer::setClass()
导出给定类中的所有方法(即,您的getPrice()
方法将使用该方法导出)。
SoapServer::addFunction()
专门用于良好的功能。你有没有机会在你当地的环境中找到一个流浪的getPrice()
函数?
您可以通过注释addFunction()
调用来测试这一点,该调用仍应显示“MyHandler”中的导出方法。
使用 SOAP_FUNCTIONS_ALL 可能是一个坏主意,就好像你删除setClass()
调用它实际上出于某种原因导出所有PHP函数......
答案 3 :(得分:0)
我使用的是PHP版本5.3.10,我遇到了同样的问题。我通过添加array
关键字解决了这个问题。
在:
$server->addFunction("functionName");
后:
$server->addFunction(array("functionName"));