Étant donné l'interface suivante:PHP Pass-by-référence incontournable?
interface ISoapInterface {
public static function registerSoapTypes(&$wsdl);
public static function registerSoapOperations(&$server);
}
Et le code suivant:
$soapProvider = array("FilePool", "UserList");
foreach($soapProvider as $provider) {
call_user_func(array($provider, "registerSoapTypes"), &$server->wsdl);
call_user_func(array($provider, "registerSoapOperations"), &$server);
}
FilePool
et UserList
à la fois mettre en œuvre ISoapInterface
.
PHP se plaindra les deux appels à l'intérieur du foreach indiquant:
Call-temps passe par référence a été désapprouvée
Je regardé ce message, et the documentation semble tout à fait clair sur la façon de résoudre ce problème. Suppression de l'esperluette de l'appel réel.
Alors j'ai changé mon code pour ressembler à ceci:
$soapProvider = array("FilePool", "UserList");
foreach($soapProvider as $provider) {
call_user_func(array($provider, "registerSoapTypes"), $server->wsdl);
call_user_func(array($provider, "registerSoapOperations"), $server);
}
Maintenant, PHP se plaint
Paramètre 1 à Filepool :: registerSoapTypes devraient être référence, la valeur donnée
Paramètre 1 à Filepool :: registerSoapOperations devrait être référence, valeur donnée
En plus de cela, la fonctionnalité est maintenant cassée. Donc, cela ne peut évidemment pas être la solution.
Si j'utilise $ provider-> registerSoapTypes, je reçois Appel à la fonction membre registerSoapTypes sur un non-objet. Les méthodes sont statiques. C'est ce qui m'amène d'abord à call_user_func, si je me souviens bien. –
@gencha J'ai raté le 'static'; mettra à jour ma réponse en conséquence. – meagar
Fonctionne très bien et le code a l'air mieux. Bravo –