2011-05-16 102 views
1

这是this question的第二部分。按名称调用静态方法

在我的项目,我有以下接口:

interface ISoapInterface { 
    public static function registerSoapTypes(wsdl &$wsdl); 
    public static function registerSoapOperations(NuSoapServer &$server); 
    public static function registerFaultHandler($callback); 
    public static function handleFault($faultcode, $faultstring, $faultdetail); 
    public static function userInfo(User $user); 
} 

现在我有实现这个接口几类,我想打电话给几个在每个这些类的这些方法。

所以有两种方法可以调用这些方法。预5.3版本:

call_user_func_array(array($provider, "registerSoapTypes"), array($server->wsdl)); 

和后5.3版本:

$provider::registerSoapTypes($server->wsdl); 

现在,我的问题是,前期5.3版本根本不会在5.3.3工作。
Parameter 1 to Foo::registerSoapTypes() expected to be a reference, value given
即使我非常确定它在5.3.0下运行良好。 The documentation还指出:

在param_arr引用变量传递给该函数通过引用,无论该功能是否期望相应的参数以引用的方式通过。这种形式的通话时间通过引用不会发出弃用通知,但它是,但不推荐使用,并且很可能会在下一版本的PHP中删除。

所以我想我被烹饪这件事真正的智能:

$soapProvider = array("Foo", "Bar", "Foo2", "Bar2"); 
foreach($soapProvider as $provider) { 

    if(!defined("PHP_VERSION_ID")) { 
    $version = explode(".", PHP_VERSION); 
    define("PHP_VERSION_ID", ($version[ 0 ] * 10000 + $version[ 1 ] * 100 + $version[ 2 ])); 
    } 

    if(PHP_VERSION_ID > 50300) { 
    // Use simple calling method on systems running PHP 5.3.0 or higher 
    $provider::registerSoapTypes($server->wsdl); 
    $provider::registerSoapOperations($server); 
    $provider::registerFaultHandler("faultHandler"); 
    $provider::userInfo($user); 

    } else { 
    call_user_func_array(array($provider, "registerSoapTypes"), array($server->wsdl)); 
    call_user_func_array(array($provider, "registerSoapOperations"), array($server)); 
    call_user_func_array(array($provider, "registerFaultHandler"), array("faulthandler")); 
    call_user_func_array(array($provider, "userInfo"), array($user)); 
    } 
} 

事实证明,这是不聪明可言,作为$provider::something()生成一个解析器错误(Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM)。

那么,在PHP 5.2.6(Debian 5)到5.3.3(Debian 6)上工作的那些类上调用这些静态方法的方式是什么(当类名是字符串的提供者时)。

回答

1

由于Znarkus写道,你不传递给Foo::registerSoapTypes参考,

所以只需添加一个&给那些需要作为参考传递参数,你call_user_func_array

的第二个参数
call_user_func_array(array($provider, "registerSoapTypes"), array(&$server->wsdl)); 

但如果不是所有的方法期待的参数是一个参考,你可以碰到一些问题,所以也许它的安全使用一些反射构造$ args作为call_user_func_array

请参见:http://www.php.net/manual/en/book.reflection.php

,尤其是:http://www.php.net/manual/en/reflectionparameter.ispassedbyreference.php

+0

不知怎的,我认为这是不合法的为好。鉴于该文档指出:函数调用中没有参考符号 - 仅限于函数定义。单独的函数定义足以通过引用正确传递参数。从PHP 5.3.0开始,当您在foo中使用&时(&$a);),您将收到一条警告,指出“通过参考时间传递”已被弃用。 – 2011-05-16 17:52:16

1

参数1到富:: registerSoapTypes()预计是一个参考,值给出

使用的call_user_func代替call_user_func_array应该解决这个问题。