PHP中的SOAP服务器错误 - 从类中添加函数

时间:2010-02-10 05:26:30

标签: php soap

我正在编写一个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()函数,这似乎不是一件好事。

我做错了什么?地毯炸弹“添加所有功能”是唯一的方法吗?

4 个答案:

答案 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"));

参考:PHP SoapServer::addFunction documentation