代码之家  ›  专栏  ›  技术社区  ›  Oliver Salzburg

PHP调用时间通过引用不可避免?

  •  3
  • Oliver Salzburg  · 技术社区  · 14 年前

    给定以下接口:

    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 );
    }
    

    FilePool UserList 两实施 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抱怨

    FilePool的参数1:应引用RegisterSoapypes,给定值
    FilePool的参数1:应引用RegisterSoapOperations,并给定值

    除此之外,功能现在已被破坏。所以这显然不是解决办法。

    2 回复  |  直到 14 年前
        1
  •  6
  •   user229044    14 年前

    call_user_func :

    注意,调用_user_func()的参数不是通过引用传递的。

    要调用静态方法,可以使用 Class::method() 语法,为 Class 和/或 method 部分:

    $soapProvider = array( "FilePool", "UserList" );
    foreach( $soapProvider as $provider ) {
      $provider::registerSoapTypes($server->wsdl);
      $provider::registerSoapOperations($server);
    }
    
        2
  •  3
  •   ircmaxell    14 年前

    同时 call_user_func 不通过引用传递参数, call_user_func_array 罐头。

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

    唯一的区别是它需要一个参数数组,而不是像 调用程序 (类似于 sprintf vsprintf )

    推荐文章