这是这个问题的第二部分。
在我的项目中,我有以下界面:
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 之前的版本在 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) 上工作的那些类(当类名是提供者作为字符串时)调用这些静态方法的方式是什么。