Передача по ссылке в PHP Call-Time неизбежна?
Учитывая следующий интерфейс:
interface ISoapInterface {
public static function registerSoapTypes( &$wsdl );
public static function registerSoapOperations( &$server );
}
И следующий код:
$soapProvider = array( "FilePool", "UserList" );
foreach( $soapProvider as $provider ) {
call_user_func( array( $provider, "registerSoapTypes" ), &$server->wsdl );
call_user_func( array( $provider, "registerSoapOperations" ), &$server );
}
FilePool
а также UserList
оба реализуют ISoapInterface
,
PHP будет жаловаться на два вызова внутри foreach с указанием:
Передача по ссылке во время разговора устарела
Итак, я посмотрел это сообщение, и документация, кажется, довольно ясно о том, как решить эту проблему. Снятие амперсанда с фактического звонка.
Поэтому я изменил свой код, чтобы он выглядел так:
$soapProvider = array( "FilePool", "UserList" );
foreach( $soapProvider as $provider ) {
call_user_func( array( $provider, "registerSoapTypes" ), $server->wsdl );
call_user_func( array( $provider, "registerSoapOperations" ), $server );
}
Теперь PHP жалуется
Параметр от 1 до FilePool::registerSoapTypes должен быть ссылкой, данное значение
Параметр от 1 до FilePool::registerSoapOperations должен быть ссылкой, задано значение
В дополнение к этому, функциональность теперь нарушена. Так что это, очевидно, не может быть решением.
2 ответа
От call_user_func
:
Обратите внимание, что параметры для call_user_func() не передаются по ссылке.
Для вызова статических методов вы можете использовать Class::method()
синтаксис, предоставляя переменную для Class
и / или method
части:
$soapProvider = array( "FilePool", "UserList" );
foreach( $soapProvider as $provider ) {
$provider::registerSoapTypes($server->wsdl);
$provider::registerSoapOperations($server);
}
В то время как call_user_func
не передает параметры по ссылке, call_user_func_array
Можно.
$callback = array($provider, 'blahblahblah');
call_user_func_array($callback, array( &$server ));
Единственное реальное отличие состоит в том, что он ожидает массив параметров вместо списка параметров, таких как call_user_func
(похоже на разницу между sprintf
а также vsprintf
)...