2010-02-10 58 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