Commit:    042ddf371e84fbb7ba1326e7bd45888e63fb30ef
Author:    Derick Rethans <git...@derickrethans.nl>         Thu, 20 Dec 2012 
13:22:18 +0000
Parents:   b1c68330161f7ccf4fdb4786ac1b0b28778d3f55
Branches:  immutable-date

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=042ddf371e84fbb7ba1326e7bd45888e63fb30ef

Log:
Make DatePeriod support DateTimeImmutable as well.

If the start element is a DateTimeImmutable object, then all returned objects
are also DateTimeImmutable objects. If the start element is a DateTime object,
then all returned objects are DateTime objects.

Changed paths:
  M  ext/date/php_date.c
  M  ext/date/php_date.h
  A  ext/date/tests/date_period-immutable.phpt


Diff:
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index 08a473d..d60cc42 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -1820,7 +1820,7 @@ static void 
date_period_it_current_data(zend_object_iterator *iter, zval ***data
 
        /* Create new object */
        MAKE_STD_ZVAL(iterator->current);
-       php_date_instantiate(date_ce_date, iterator->current TSRMLS_CC);
+       php_date_instantiate(object->start_ce, iterator->current TSRMLS_CC);
        newdateobj = (php_date_obj *) 
zend_object_store_get_object(iterator->current TSRMLS_CC);
        newdateobj->time = timelib_time_ctor();
        *newdateobj->time = *it_time;
@@ -4151,6 +4151,7 @@ PHP_METHOD(DatePeriod, __construct)
                if (dpobj->end) {
                        timelib_update_ts(dpobj->end, NULL);
                }
+               dpobj->start_ce = date_ce_date;
        } else {
                /* init */
                intobj  = (php_interval_obj *) 
zend_object_store_get_object(interval TSRMLS_CC);
@@ -4166,6 +4167,7 @@ PHP_METHOD(DatePeriod, __construct)
                        clone->tz_info = dateobj->time->tz_info;
                }
                dpobj->start = clone;
+               dpobj->start_ce = Z_OBJCE_P(start);
 
                /* interval */
                dpobj->interval = timelib_rel_time_clone(intobj->diff);
diff --git a/ext/date/php_date.h b/ext/date/php_date.h
index fb12dbc..8c4ca00 100644
--- a/ext/date/php_date.h
+++ b/ext/date/php_date.h
@@ -154,6 +154,7 @@ struct _php_interval_obj {
 struct _php_period_obj {
        zend_object       std;
        timelib_time     *start;
+       zend_class_entry *start_ce;
        timelib_time     *current;
        timelib_time     *end;
        timelib_rel_time *interval;
diff --git a/ext/date/tests/date_period-immutable.phpt 
b/ext/date/tests/date_period-immutable.phpt
new file mode 100644
index 0000000..0ec4b4a
--- /dev/null
+++ b/ext/date/tests/date_period-immutable.phpt
@@ -0,0 +1,56 @@
+--TEST--
+DatePeriod
+--FILE--
+<?php
+date_default_timezone_set('UTC');
+$db1 = new DateTimeImmutable( '2008-01-01' );
+$db2 = new DateTime( '2008-01-01' );
+$de = new DateTime( '2008-03-31' );
+$di = DateInterval::createFromDateString( 'first day of next month' );
+
+foreach ( new DatePeriod( $db1, $di, $de ) as $dt )
+{
+       echo get_class( $dt ), "\n";
+       echo $dt->format( "l Y-m-d\n" );
+    echo $dt->modify( "3 tuesday" )->format( "l Y-m-d\n" );
+       echo $dt->format( "l Y-m-d\n\n" );
+}
+
+foreach ( new DatePeriod( $db2, $di, $de ) as $dt )
+{
+       echo get_class( $dt ), "\n";
+       echo $dt->format( "l Y-m-d\n" );
+    echo $dt->modify( "3 tuesday" )->format( "l Y-m-d\n" );
+       echo $dt->format( "l Y-m-d\n\n" );
+}
+?>
+--EXPECT--
+DateTimeImmutable
+Tuesday 2008-01-01
+Tuesday 2008-01-15
+Tuesday 2008-01-01
+
+DateTimeImmutable
+Friday 2008-02-01
+Tuesday 2008-02-19
+Friday 2008-02-01
+
+DateTimeImmutable
+Saturday 2008-03-01
+Tuesday 2008-03-18
+Saturday 2008-03-01
+
+DateTime
+Tuesday 2008-01-01
+Tuesday 2008-01-15
+Tuesday 2008-01-15
+
+DateTime
+Friday 2008-02-01
+Tuesday 2008-02-19
+Tuesday 2008-02-19
+
+DateTime
+Saturday 2008-03-01
+Tuesday 2008-03-18
+Tuesday 2008-03-18


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to