Учитывая следующий интерфейс:
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
) …