这是this question的第二部分。按名称调用静态方法
在我的项目,我有以下接口:
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下运行良好。 The documentation还指出:
在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)上工作的那些类上调用这些静态方法的方式是什么(当类名是字符串的提供者时)。
不知怎的,我认为这是不合法的为好。鉴于该文档指出:函数调用中没有参考符号 - 仅限于函数定义。单独的函数定义足以通过引用正确传递参数。从PHP 5.3.0开始,当您在foo中使用&时(&$a);),您将收到一条警告,指出“通过参考时间传递”已被弃用。 – 2011-05-16 17:52:16