Sì, non sei l'unico ad avere questo problema - Ho visto un numero infinito di post in cui le persone affermano che l'array è passato a SoapVar con SOAP_ENC_OBJECT risolve il problema mentre altre persone rivendicano il contrario sugli stessi post. E la documentazione non è chiara sui motivi (a parte il mio post anno fa nella sezione commenti di php.net).
Di fronte allo stesso problema, ho letto le fonti dell'estensione PHP SOAP. Fondamentalmente la sintassi che avete usato è assolutamente corretto:
$param = array(
"_" => 'value',
'attrName' => 'attributeName'
);
$p = new SoapVar($param, SOAP_ENC_OBJECT);
Che la documentazione non dice: questa sintassi può produrre due risultati diversi (e in realtà anche di più: SOAP PHP può esprimere in otto modi diversi). E come puoi vedere il codice sopra è ambiguo: cosa nel codice sopra dice che 'attrName' è un attributo e non un elemento? Niente. Il codice qui sopra non ha una quantità sufficiente di informazioni per SoapClient per decidere cosa sia 'attrName' e quindi è impostato su "un elemento".
SoapClient può funzionare in due modalità: non WSDL e WSDL. Nella precedente modalità non si otterrebbe mai il risultato desiderato: SoapClient si basa sulle informazioni sul tipo per trasformare l'elemento dell'array in attributo. Poiché le informazioni sul tipo non sono presenti in modalità non WSDL, SoapClient rappresenta l'array fornito come set di elementi, esattamente ciò che hai ottenuto.In modalità WSDL sono presenti le informazioni sul tipo e quindi SoapClient conosce gli elementi e i nomi degli attributi e può associarli agli indici di array. Quindi DEVI avere il tuo SoapClient in modalità WSDL se vuoi i tuoi attributi.
sostanza al fine di ottenere ciò che si vuole è necessario disporre di file WSDL in modalità documento/literal con < xsd: attributo name = tipo "attrName" = "xsd: string" /> nella sezione appropriata di < xsd: schema > blocco.
Il motivo per cui alcune persone affermano il successo dell'uso di array per attributi e altre persone dicono "Non funziona" si trova solo nella loro configurazione: alcune persone hanno file WSDL da consumare, alcune persone cercano solo di fare un nuovo SoapClient (null , matrice (...)); (che naturalmente fallisce le loro aspettative)
fonte
2016-11-11 21:30:39
come ha sottolineato Vladimir, questo funzionerà solo in modalità WSDL! – jfx