]> granicus.if.org Git - php/commitdiff
EmptyIterator now implements Countable; fixes bug 60577
authorLevi Morrison <levim@php.net>
Thu, 12 Sep 2013 22:03:39 +0000 (16:03 -0600)
committerDavid Soria Parra <dsp@php.net>
Mon, 16 Sep 2013 02:04:53 +0000 (04:04 +0200)
(cherry picked from commit 6398844c86bee08abe4ee3f206ecd86ad0a498f9)

ext/spl/internal/emptyiterator.inc
ext/spl/spl_iterators.c
ext/spl/tests/bug60577.phpt [new file with mode: 0644]

index ac80e795812393482df82b3352dad36c5cb320d6..d02b15b999c50a8815fa9c66f8d2342817dbf5d2 100644 (file)
@@ -15,7 +15,7 @@
  * @version 1.0
  * @since PHP 5.1
  */
-class EmptyIterator implements Iterator
+class EmptyIterator implements Iterator, Countable
 {
        /** No operation.
         * @return void
@@ -57,6 +57,15 @@ class EmptyIterator implements Iterator
        {
                // nothing to do
        }
+
+       /**
+        * @return int
+        */
+       function count()
+       {
+               return 0;
+       }
+
 }
 
-?>
\ No newline at end of file
+?>
index eb8247654ecbdb24bae7e13ce11c099bef43b7c1..ad76258413328dbcd304504241074ff501236128 100644 (file)
@@ -3279,12 +3279,23 @@ SPL_METHOD(EmptyIterator, next)
        }
 } /* }}} */
 
+/* {{{ proto int EmptyIterator::count()
+   Does nothing */
+SPL_METHOD(EmptyIterator, count)
+{
+       if (zend_parse_parameters_none() == FAILURE) {
+               return;
+       }
+       RETURN_LONG(0);
+} /* }}} */
+
 static const zend_function_entry spl_funcs_EmptyIterator[] = {
        SPL_ME(EmptyIterator, rewind,           arginfo_recursive_it_void, ZEND_ACC_PUBLIC)
        SPL_ME(EmptyIterator, valid,            arginfo_recursive_it_void, ZEND_ACC_PUBLIC)
        SPL_ME(EmptyIterator, key,              arginfo_recursive_it_void, ZEND_ACC_PUBLIC)
        SPL_ME(EmptyIterator, current,          arginfo_recursive_it_void, ZEND_ACC_PUBLIC)
        SPL_ME(EmptyIterator, next,             arginfo_recursive_it_void, ZEND_ACC_PUBLIC)
+       SPL_ME(EmptyIterator, count,            arginfo_recursive_it_void, ZEND_ACC_PUBLIC)
        PHP_FE_END
 };
 
@@ -3756,6 +3767,7 @@ PHP_MINIT_FUNCTION(spl_iterators)
 
        REGISTER_SPL_STD_CLASS_EX(EmptyIterator, NULL, spl_funcs_EmptyIterator);
        REGISTER_SPL_ITERATOR(EmptyIterator);
+       REGISTER_SPL_IMPLEMENTS(EmptyIterator, Countable);
 
        REGISTER_SPL_SUB_CLASS_EX(RecursiveTreeIterator, RecursiveIteratorIterator, spl_RecursiveTreeIterator_new, spl_funcs_RecursiveTreeIterator);
        REGISTER_SPL_CLASS_CONST_LONG(RecursiveTreeIterator, "BYPASS_CURRENT",      RTIT_BYPASS_CURRENT);
diff --git a/ext/spl/tests/bug60577.phpt b/ext/spl/tests/bug60577.phpt
new file mode 100644 (file)
index 0000000..33fc133
--- /dev/null
@@ -0,0 +1,8 @@
+--TEST--
+count(new EmptyIterator) should return zero
+--FILE--
+<?php
+$it = new EmptyIterator;
+var_dump(count($it));
+--EXPECT--
+int(0)