From 751f9c979bd0d3ca2198ad31009d4cb4cff691cc Mon Sep 17 00:00:00 2001 From: gggeek Date: Sun, 7 Jun 2015 21:13:59 +0200 Subject: [PATCH] Added support for Countable and IteratorAggregate interfaces --- NEWS | 2 ++ doc/api_changes_v4.md | 13 ++++++++ src/Value.php | 69 +++++++++++++++++++++++++------------------ 3 files changed, 56 insertions(+), 28 deletions(-) diff --git a/NEWS b/NEWS index 5880306..65d245a 100644 --- a/NEWS +++ b/NEWS @@ -25,6 +25,8 @@ PLEASE READ CAREFULLY THE NOTES BELOW to insure a smooth upgrade. * improved: no need to call anymore $client->setSSLVerifyHost(2) to silence a curl warning when using https with recent curl builds +* improved: the xmlrpcval class now supports the interfaces Countable and IteratorAggregate + * improved: a specific option allows users to decide the version of SSL to use for https calls. This is useful f.e. for the testing suite, when the server target of calls has no proper ssl certificate, and the cURL extension has been compiled with GnuTLS (such as on Travis VMs) diff --git a/doc/api_changes_v4.md b/doc/api_changes_v4.md index b587d9b..2403020 100644 --- a/doc/api_changes_v4.md +++ b/doc/api_changes_v4.md @@ -45,6 +45,19 @@ Conversion table: | xmlrpcval | PhpXmlRpc\Value | Removed methods: serializeval, getval | +New class methods +----------------- + +In case you had extended the classes of the library and added methods to the subclasses, you might find that your +implementation clashes with the new one if you implemented: + + +| Class | Method | Notes | +| --------- | ----------- | -------------------------------------- | +| xmlrpcval | count | implements interface Countable | +| xmlrpcval | getIterator | implements interface IteratorAggregate | + + Global variables cleanup ------------------------ diff --git a/src/Value.php b/src/Value.php index f544fa5..6e8d7ef 100644 --- a/src/Value.php +++ b/src/Value.php @@ -4,7 +4,7 @@ namespace PhpXmlRpc; use PhpXmlRpc\Helper\Charset; -class Value +class Value implements \Countable, \IteratorAggregate { public static $xmlrpcI4 = "i4"; public static $xmlrpcInt = "int"; @@ -37,7 +37,8 @@ class Value public $_php_class = null; /** - * Build an xmlrpc value + * Build an xmlrpc value. + * When no value or type is passed in, the value is left uninitialized, and the value can be added later * * @param mixed $val * @param string $type any valid xmlrpc type name (lowercase). If null, 'string' is assumed @@ -47,7 +48,6 @@ class Value // optimization creep - do not call addXX, do it all inline. // downside: booleans will not be coerced anymore if ($val !== -1 || $type != '') { - // optimization creep: inlined all work done by constructor switch ($type) { case '': $this->mytype = 1; @@ -75,28 +75,11 @@ class Value default: error_log("XML-RPC: " . __METHOD__ . ": not a known type ($type)"); } - /* was: - if($type=='') - { - $type='string'; - } - if(static::$xmlrpcTypes[$type]==1) - { - $this->addScalar($val,$type); - } - elseif(static::$xmlrpcTypes[$type]==2) - { - $this->addArray($val); - } - elseif(static::$xmlrpcTypes[$type]==3) - { - $this->addStruct($val); - }*/ } } /** - * Add a single php value to an (unitialized) xmlrpc value. + * Add a single php value to an (uninitialized) xmlrpc value. * * @param mixed $val * @param string $type @@ -112,7 +95,6 @@ class Value if ($typeOf !== 1) { error_log("XML-RPC: " . __METHOD__ . ": not a scalar type ($type)"); - return 0; } @@ -130,11 +112,9 @@ class Value switch ($this->mytype) { case 1: error_log('XML-RPC: ' . __METHOD__ . ': scalar xmlrpc value can have only one value'); - return 0; case 3: error_log('XML-RPC: ' . __METHOD__ . ': cannot add anonymous scalar to struct xmlrpc value'); - return 0; case 2: // we're adding a scalar value to an array here @@ -173,7 +153,6 @@ class Value return 1; } else { error_log('XML-RPC: ' . __METHOD__ . ': already initialized as a [' . $this->kindOf() . ']'); - return 0; } } @@ -201,13 +180,12 @@ class Value return 1; } else { error_log('XML-RPC: ' . __METHOD__ . ': already initialized as a [' . $this->kindOf() . ']'); - return 0; } } /** - * Returns a string containing "struct", "array" or "scalar" describing the base type of the value. + * Returns a string containing "struct", "array", "scalar" or "undef" describing the base type of the value. * * @return string */ @@ -428,6 +406,8 @@ class Value * Returns the number of members in an xmlrpc value of array type. * * @return integer + * + * @deprecated use count() instead */ public function arraysize() { @@ -438,9 +418,42 @@ class Value * Returns the number of members in an xmlrpc value of struct type. * * @return integer + * + * @deprecateduse count() instead */ public function structsize() { return count($this->me['struct']); } -} + + /** + * Returns the number of members in an xmlrpc value: + * - 0 for uninitialized values + * - 1 for scalars + * - the number of elements for structs and arrays + * + * @return integer + */ + public function count() + { + switch ($this->mytype) { + case 3: + count($this->me['struct']); + case 2: + return count($this->me['array']); + case 1: + return 1; + default: + return 0; + } + } + + /** + * Implements the IteratorAggregate interface + * + * @return ArrayIterator + */ + public function getIterator() { + return new \ArrayIterator($this->me); + } +} \ No newline at end of file -- 2.43.0