Передача по ссылке в 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)...

Другие вопросы по тегам