通过名称调用类的静态方法

| 这是这个问题的第二部分。 在我的项目中,我具有以下界面:
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.3之前的版本根本无法使用。
Parameter 1 to Foo::registerSoapTypes() expected to be a reference, value given
即使我很确定它在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, unexpected T_PAAMAYIM_NEKUDOTAYIM
)。 因此,在PHP 5.2.6(Debian 5)到5.3.3(Debian 6)上工作的那些类上(当类名是作为字符串的提供者时)调用那些静态方法的方式是什么。     
已邀请:
正如Znarkus所写,您没有引用
Foo::registerSoapTypes
, 所以只要在" 8"的第二个参数中添加一个&即可,这些参数需要作为引用传递
call_user_func_array( array( $provider, \"registerSoapTypes\" ), array( &$server->wsdl ) );
但是,如果并非所有方法都希望参数作为参考,则可能会遇到一些问题,因此使用一些反射为ѭ8构建$ args也许更安全。 参见:http://www.php.net/manual/en/book.reflection.php 特别是:http://www.php.net/manual/en/reflectionparameter.ispassedbyreference.php     
  Foo :: registerSoapTypes()的参数1应该是参考,给定值 使用
call_user_func
代替
call_user_func_array
应该可以解决此问题。     

要回复问题请先登录注册