Re: Re: XML_RPC for php5

From: Date: Sat, 02 Oct 2004 16:24:33 +0000
Subject: Re: Re: XML_RPC for php5
References: 1 2  Groups: php.pear.dev 
Request: Send a blank email to pear-dev+get-33616@lists.php.net to get a copy of this message
Hi Sergio, I suspect I have missed email(s) from you on this. I agree with your approach, and that the time is right to start with a clean slate with all the PHP 5 goodies that would make XML_RPC much cleaner. - Stig On Tue, 2004-09-28 at 20:08, Sergio Carvalho wrote: > Great minds think alike :-) I've been trying for a month now to get > Stig, who is the current maintainer of XML_RPC, to get a look at my > implementation. Its now under production use internally at my employer. > It is also meant as a showcase of Exception usage. It's fully > documented, and available for integration in PEAR as soon as the method > for evolving packages to PHP 5 is defined. > > The library is a complete departure from Useful Inc's codebase. BC > compatibility is broken to make it possible the use of PHP5's __call > catchall. With the new version, executing an XML_RPC call is as easy as: > $client = new > XML_RPC_Client('http://rpc.example.com/1.0/'); > $client->exampleMethod(1,2,'abc'); > Encoding and decoding is done automatically, there's no need for all the > low level wrangling Useful Inc's library required. It also leans more > heavily on PHP5's XML abilities, whereas Useful Inc's library > implemented its own XML parser. > > You can have a look at the source code here: > http://files.sergiocarvalho.com/2004/XML_RPC/ > Examples, namely, are here: > http://files.sergiocarvalho.com/2004/XML_RPC/doc/examples/ > A complete tgz of the package is here: > http://files.sergiocarvalho.com/2004/XML_RPC/XML_RPC.tgz > > Cheers, > > Greg Beaver wrote: > > Hi, > > > > In a fit of boredom/inspiration last night and tonight, I wrote an > > XML_RPC Client/Server implementation in PHP5 that can use the xmlrpc > > extension if available, or direct PHP if not, both transparently. > > > > Line counts: > > > > Client: 147 > > Server: 270 > > base xml-rpc class: 64 > > php driver: 320 > > xmlrpc-epi driver: 68 > > interface: 9 > > --- > > TOTAL: 878 > > TOTAL AT ANY TIME: 560-810 > > > > These are prior to commenting. > > > > Basic usage is as follows: > > > > <?php > > require_once 'XML/RPC5/Client.php'; > > $client = new > > XML_RPC5_Client('http://pear.chiaraquartet.net/xmlrpc.php'); > > print_r($client->{'system.listMethods'}()); > > ?> > > > > Note that the above syntax allows "." in a method name, as in > > $obj->{"methodname"}([params]); A call method is available for those > > who are made queasy by this syntax > > > > $client->call('system.listMethods'[, $param1, $param2, ...]); > > > > You can also extend the class in two ways to automatically define the > > class, and call methods normally > > > > Option #1: > > <?php > > require_once 'XML/RPC5/Client.php'; > > class myclass extends XML_RPC5_Client > > { > > protected $rpcclass = 'system'; > > } > > $client = new myclass; > > print_r($client->listMethods()); > > ?> > > > > Option #2: > > <?php > > require_once 'XML/RPC5/Client.php'; > > class XML_RPC5_Client_system extends XML_RPC5_Client {} > > $client = new XML_RPC5_Client_system; > > print_r($client->listMethods()); > > ?> > > > > The server is also easy to use, and supports full introspection. Unlike > > other generic server implementations, it easily supports multiple > > classes implementing different XML-RPC classes (one class for all > > "package.*" methods, one class for all "channel.*"). The best feature > > > > is that it automatically pulls introspection data from the class using > > reflection, and so server setup is something like the following: > > > > Option #1 (inheritance): > > <?php > > require_once 'XML/RPC5/Server.php'; > > class MyServer extends XML_RPC5_Server > > { > > /** > > * method summary - will be retrievable by introspection > > * @param string This comment is ignored by docblock parser > > * @param int > > * @return array > > */ > > function someFunc($a, $b = 1) > > { > > //..... > > } > > > > /** > > * does something else > > * @param array > > * @return mixed > > */ > > function somethingElse($arr) > > { > > } > > } > > $server = new MyServer('xmlrpc.php', 'rpcclass'); > > // handles rpcclass.someFunc, rpcclass.somethingElse > > MyServer::run(); > > ?> > > > > Let's say you have a pre-existing class that extends another class, and > > so you can't make it extend XML_RPC5_Server. No problem! Just use the > > interface provided, and it will work. > > > > Option #2 (interface): > > <?php > > require_once 'XML/RPC5/Server.php'; > > class MyServer extends XML_RPC5_Server implements XML_RPC5_Interface_Server > > { > > private $_uri; > > > > public function __construct($uri) > > { > > $this->_uri = $uri; > > } > > > > /** > > * method summary - will be retrievable by introspection > > * @param string This comment is ignored by docblock parser > > * @param int > > * @return array > > */ > > function someFunc($a, $b = 1) > > { > > //..... > > } > > > > /** > > * does something else > > * @param array > > * @return mixed > > */ > > function somethingElse($arr) > > { > > } > > > > public function getXmlrpcServerMethodMap() > > { > > // map rpc method names to real methods > > return array(); > > } > > > > public function getXmlrpcServerUri() > > { > > return $this->_uri; > > } > > > > public function getXmlrpcServerClassName() > > { > > return 'rpcclass'; > > } > > > > public function getSignatures($rpcclass, $phpclass) > > { > > return XML_RPC5_Server::getSignatures('rpcclass', $this); > > } > > } > > $server = new > > MyServer('http://pear.chiaraquartet.net/xmlrpc.php'); > > XML_RPC5_Server::registerServer($server); > > XML_RPC5_Server::run(); > > ?> > > > > The best thing is that basic methods in the interface or the server are > > ignored when creating the method lists. Also, by putting a "@noxmlrpc" > > tag anywhere in a docblock, a method will be ignored. Only public > > methods will be exposed, obviously. > > > > So, then the question is raised - what does PEAR want to do, assuming > > the code is liked? Should I propose XML_RPC5 through PEPr? Or just > > keep it off-pear in my chiara channel? I will be using it in > > Chiara_Server to cut LOADS of code away from the xml-rpc stuff and > > remove the xmlrpc extension dep. It would also be wonderful for PEAR2, > > but that is a long ways off. > > > > Needless to say, this is a pure php5-only implementation (I might enter > > it in the Zend contest, who knows) that uses lots of php5-only features > > (__call(), reflection, exceptions, interfaces, PPP, simplexml), and > > can't be backported at all. > > > > Greg >

« previous php.pear.dev (#33616) next »