這是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