2011-05-16 91 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應該解決這個問題。