Передача по ссылке в PHP Call-Time неизбежна? - PullRequest
3 голосов
/ 19 октября 2010

Учитывая следующий интерфейс:

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 ]

6 голосов
/ 19 октября 2010

Из 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);
}
3 голосов
/ 19 октября 2010

Пока call_user_func не передает параметры по ссылке, call_user_func_array может.

$callback = array($provider, 'blahblahblah');
call_user_func_array($callback, array( &$server ));

Единственное реальное отличие состоит в том, что он ожидает массив параметров вместо списка параметров, таких как call_user_func (аналогично разнице между sprintf и vsprintf ) ...

...