Php 按名称调用类的静态方法

Php 按名称调用类的静态方法,php,php-5.3,php-5.2,Php,Php 5.3,Php 5.2,这是本文的第二部分 在我的项目中,我有以下界面: interface ISoapInterface { public static function registerSoapTypes( wsdl &$wsdl ); public static function registerSoapOperations( NuSoapServer &$server ); public static function registerFaultHandler( $callback

这是本文的第二部分

在我的项目中,我有以下界面:

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 ) );
$provider::registerSoapTypes( $server->wsdl );
以及5.3版之后的版本:

call_user_func_array( array( $provider, "registerSoapTypes" ), array( $server->wsdl ) );
$provider::registerSoapTypes( $server->wsdl );
现在,我的问题是,5.3之前的版本在5.3.3中根本不起作用。
参数1到Foo::registerSoapTypes()应为参考,给定值

尽管我很确定它在5.3.0中运行良好。还指出:

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,意外的t\u PAAMAYIM\u NEKUDOTAYIM

那么,在PHP5.2.6(Debian 5)到5.3.3(Debian 6)上工作的类(当类名是provider作为字符串时)上调用这些静态方法的方式是什么呢

Foo::registerSoapTypes()的参数1应为引用,给定值


使用
call\u user\u func
而不是
call\u user\u func\u array
应该可以解决这个问题。

正如Znarkus所写,您没有传递对
Foo::registerSoapTypes
的引用

因此,只需在需要作为引用传递的参数中添加一个&,在
调用用户函数数组的第二个参数中

call_user_func_array( array( $provider, "registerSoapTypes" ), array( &$server->wsdl ) );
但是,如果不是所有方法都希望参数是引用,那么您可能会遇到一些问题,因此使用一些反射为
call\u user\u func\u数组
构造$args可能更安全

见:


尤其是:

不知何故,我认为这也不合法。假设文档中声明:函数调用上没有引用符号-仅在函数定义上。仅函数定义就足以通过引用正确传递参数。从PHP5.3.0开始,当您使用&in-foo(&$a);,您将收到一条警告,指出“调用时间按引用传递”是不推荐的;。