2010-10-19 54 views
3

考慮到如下界面:PHP通話時間通過引用不可避免?

interface ISoapInterface { 
    public static function registerSoapTypes(&$wsdl); 
    public static function registerSoapOperations(&$server); 
} 

以下代碼:

$soapProvider = array("FilePool", "UserList"); 
foreach($soapProvider as $provider) { 
    call_user_func(array($provider, "registerSoapTypes"), &$server->wsdl); 
    call_user_func(array($provider, "registerSoapOperations"), &$server); 
} 

FilePoolUserList都實現ISoapInterface

PHP會抱怨的foreach內的兩個來電指出:

通話時傳遞的引用已被棄用

所以我看這個信息了,the documentation似乎相當清楚如何解決這個問題。從實際呼叫中刪除&符號。
所以我改變了我的代碼看起來像這樣:

$soapProvider = array("FilePool", "UserList"); 
foreach($soapProvider as $provider) { 
    call_user_func(array($provider, "registerSoapTypes"), $server->wsdl); 
    call_user_func(array($provider, "registerSoapOperations"), $server); 
} 

現在PHP抱怨

參數1至FilePool是::預期爲基準registerSoapTypes,值給出
參數1至FilePool是:: registerSoapOperations預計將作爲參考,給出的值

除此之外,功能現在已被打破。所以這顯然不能解決問題。

回答

6

call_user_func

注意,對於call_user_func()的參數不被引用傳遞。

要調用可以使用Class::method()語法靜態方法,對於Class和/或method零件供給一個變量:

$soapProvider = array("FilePool", "UserList"); 
foreach($soapProvider as $provider) { 
    $provider::registerSoapTypes($server->wsdl); 
    $provider::registerSoapOperations($server); 
} 
+0

如果我使用$ provider-> registerSoapTypes,我得到一個非對象的成員函數registerSoapTypes的調用。這些方法是靜態的。如果我沒有記錯的話,那就是最初將我引向call_user_func的原因。 – 2010-10-19 16:18:46

+0

@gencha我錯過了'static';會相應地更新我的答案。 – meagar 2010-10-19 16:25:51

+0

工程很好,代碼看起來更好。歡呼聲 – 2010-10-19 16:32:59

3

call_user_func雖然通過參考不傳遞參數,call_user_func_array即可。

$callback = array($provider, 'blahblahblah'); 
call_user_func_array($callback, array(&$server)); 

唯一的區別是,它預計的參數,而不是像call_user_func(類似於sprintfvsprintf之間的差)的參數列表的數組...

+0

這實際上是完美的,我只是想知道我是否想念一些關於邁格爾解決方案的東西。謝謝 – 2010-10-19 16:27:26

+0

那麼,@ meagar的解決方案是好的。它只是直接調用方法,而不是調用一個函數來完成它。這就像執行'$ object-> method()',但對於靜態方法'class :: method()'或'$ className :: method()',其中'$ className'包含類的字符串名稱你的原始代碼)。這兩種解決方案都很好@ meagar的速度更快,效率更高,但我的靈活性更強('$ callback'可以是任何東西,參數的個數可以變化)。兩者都是有效的...... – ircmaxell 2010-10-19 16:31:33