Reading time: 2 – 3 minutes
Update: LES CONCLUSIONS D’AQUEST ARTICLE SÓN ERRONEES MIREU: PHP5: passant i tornant objectes com a paràmetre en una crida SOAP (Part II)
Treballant en un projecte que estem programant en PHP5 em va sortir aquest dubte, sobretot després de llegir les limitacions dels servidors SOAP que implementa PHP5. El tema finalment té una resposta positiva: SI, PERO…. A continuació us poso un exemple de com funciona aquest tema amb el PHP5 i quines limitacions té.
Definim el servidor SOAP que com podeu veure és senzillissim, l’únic que fa el servidor és re-enviar el mateix objecte que ha rebut.
<php class SOAPservice { function peticion($per) { return $per; } } $server = new SoapServer("server.wsdl"); $server->setClass("SOAPservice"); $server->handle(); ?>
A continuació podeu veure el codi del client, és un codi molt senzill de només dues línies. Com podem veure primer definim la classe persona i abans de cridar el client SOAP instanciem la classe, després usem aquest objecte com a paràmetre a la crida SOAP. Capturem l’objecte que ens retorna el servidor SOAP i a continuació mostrem el seu contingut amb l’ordre print_r.
<?php /* definim classe persona */ class persona { public $nom; function setNom($nom) { $this->nom=$nom; } function setCognom($cognom) { $this->cognom=$cognom; } function getNom() { return $this->nom; } function getCognom() { return $this->cognom; } } /* creem objecte tipus persona */ $myPersona=new persona; $myPersona->setNom("el_nom"); $myPersona->setCognom("el_cognom"); /* fem una crida SOAP amb un objecte com a parametre */ $client = new SoapClient("server.wsdl"); $myObj=$client->peticion($myPersona); /* mostrem objecte generic que retorna la crida SOAP */ print_r($myObj); ?>
Si mirem la sortida que ens dona quan cridem el client podem veure que l’objecte que torna no és del tipus persona sinó d’un tipus intern del PHP5 anomenat stdClass. Aquest objecte només disposa dels atributs públics. No podem accedir als atributs privats o protegits i hem perdut tots els mètodes siguin del tipus que siguin.
stdClass Object ( [nom] => el_nom [cognom] => el_cognom )
Això és tot el que he pogut aconseguir, no és gaire però com a mínim a mi m’ha estat suficient.
0 thoughts on “PHP5: passant objectes com a paràmetre en una crida SOAP”
Sembla com si no estiguesis content amb el resultat, a mi em sembla correcte el funcionament de la POO que comentes.
atributs/metodes publics: visibles desde tots els llocs
atributs/metodes protegits: visibles desde la propia clase i les classes filles d'aquesta
atributs/metodes privats: nomes visbles desde la propia classe
Si vols traure mes informacio sobre la classe has de tirar ma de "reflection"
Tot aixo partint de que no he treballat mai amb objectes amb el PHP pero he pegat una ullada a la seva web 😉
La gràcia del tema esta, en que quan l'objecte arriba al servidor SOAP no té tipus, es converteix en un tipus standar com el que comento a l'article i jo em pensava que seguiria mantenint el tipus, malgrat hagués de tenir la classe declara en el servidor, però no és així. De fet, no passa res però hagués estat un puntasso poder passar tots els mètodes i propietats de cop d'un PC a un altre a través de SOAP.