Частота пересылки по вызову PHP неизбежно?

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

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 ожидается как ссылка, значение указано

В дополнение к этому, функциональность теперь сломана. Таким образом, это, очевидно, не может быть решением.

Из 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 ) …