PHP调用时间传递不可避免?

时间:2010-10-19 13:27:22

标签: php pass-by-reference

给出以下界面:

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应该是引用,给定值

除此之外,功能现已破裂。所以这显然不是解决方案。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:3)

虽然call_user_func未通过引用传递参数,但call_user_func_array可以。

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

唯一真正的区别是它需要一组参数而不是call_user_func之类的参数列表(类似于sprintfvsprintf之间的差异)......