ID: 50559
Comment by: yoarvi at gmail dot com
Reported By: sr at emini dot dk
Status: Assigned
Bug Type: Date/time related
Operating System: Fedora 10
PHP Version: 5.3.1
Assigned To: derick
New Comment:
The following patch implements the logic to clone DatePeriod and
DateInterval objects and also includes a test case:
Index: ext/date/php_date.c
===================================================================
--- ext/date/php_date.c (revision 293574)
+++ ext/date/php_date.c (working copy)
@@ -2213,7 +2213,9 @@
zend_objects_clone_members(&new_obj->std, new_ov, &old_obj->std,
Z_OBJ_HANDLE_P(this_ptr) TSRMLS_CC);
- /** FIX ME ADD CLONE STUFF **/
+ new_obj->diff = timelib_rel_time_clone(old_obj->diff);
+ new_obj->initialized = 1;
+
return new_ov;
}
@@ -2283,7 +2285,27 @@
zend_objects_clone_members(&new_obj->std, new_ov, &old_obj->std,
Z_OBJ_HANDLE_P(this_ptr) TSRMLS_CC);
- /** FIX ME ADD CLONE STUFF **/
+ new_obj->start = timelib_time_ctor();
+ *new_obj->start = *old_obj->start;
+ if (old_obj->start->tz_abbr) {
+ new_obj->start->tz_abbr = strdup(old_obj->start->tz_abbr);
+ }
+ if (old_obj->start->tz_info) {
+ new_obj->start->tz_info = old_obj->start->tz_info;
+ }
+ new_obj->end = timelib_time_ctor();
+ *new_obj->end = *old_obj->end;
+ if (old_obj->end->tz_abbr) {
+ new_obj->end->tz_abbr = strdup(old_obj->end->tz_abbr);
+ }
+ if (old_obj->end->tz_info) {
+ new_obj->end->tz_info = old_obj->end->tz_info;
+ }
+ new_obj->interval = timelib_rel_time_clone(old_obj->interval);
+ new_obj->recurrences = old_obj->recurrences;
+ new_obj->include_start_date = old_obj->include_start_date;
+ new_obj->initialized = 1;
+
return new_ov;
}
Index: ext/date/tests/bug50559.phpt
===================================================================
--- ext/date/tests/bug50559.phpt (revision 0)
+++ ext/date/tests/bug50559.phpt (revision 0)
@@ -0,0 +1,131 @@
+--TEST--
+Bug #50559 (Clone is not implemented for DateInterval and DatePeriod)
+--FILE--
+<?php
+date_default_timezone_set('Asia/Calcutta');
+
+# Test DateInterval cloning
+$dateInterval1 = new \DateInterval('P1D');
+$dateInterval2 = clone $dateInterval1;
+echo "============================\n";
+echo "DateInterval (original)\n";
+var_dump($dateInterval1);
+echo "============================\n";
+echo "DateInterval (clone)\n";
+var_dump($dateInterval2);
+
+# Test DatePeriod cloning
+$begin = new DateTime('2007-12-31');
+$end = new DateTime('2009-12-31 23:59:59');
+$interval = DateInterval::createFromDateString('last thursday of next
month');
+$datePeriod1 = new \DatePeriod($begin, $interval, $end,
+ DatePeriod::EXCLUDE_START_DATE);
+$datePeriod2 = clone $datePeriod1;
+
+echo "============================\n";
+echo "DatePeriod (original)\n";
+foreach ($datePeriod1 as $p) {
+ echo $p->format("l Y-m-d H:i:s\n");
+}
+
+echo "============================\n";
+echo "DatePeriod (clone)\n";
+foreach ($datePeriod2 as $p) {
+ echo $p->format("l Y-m-d H:i:s\n");
+}
+echo "============================\n";
+?>
+--EXPECT--
+============================
+DateInterval (original)
+object(DateInterval)#1 (8) {
+ ["y"]=>
+ int(0)
+ ["m"]=>
+ int(0)
+ ["d"]=>
+ int(1)
+ ["h"]=>
+ int(0)
+ ["i"]=>
+ int(0)
+ ["s"]=>
+ int(0)
+ ["invert"]=>
+ int(0)
+ ["days"]=>
+ int(0)
+}
+============================
+DateInterval (clone)
+object(DateInterval)#2 (8) {
+ ["y"]=>
+ int(0)
+ ["m"]=>
+ int(0)
+ ["d"]=>
+ int(1)
+ ["h"]=>
+ int(0)
+ ["i"]=>
+ int(0)
+ ["s"]=>
+ int(0)
+ ["invert"]=>
+ int(0)
+ ["days"]=>
+ int(0)
+}
+============================
+DatePeriod (original)
+Thursday 2008-01-31 00:00:00
+Thursday 2008-02-28 00:00:00
+Thursday 2008-03-27 00:00:00
+Thursday 2008-04-24 00:00:00
+Thursday 2008-05-29 00:00:00
+Thursday 2008-06-26 00:00:00
+Thursday 2008-07-31 00:00:00
+Thursday 2008-08-28 00:00:00
+Thursday 2008-09-25 00:00:00
+Thursday 2008-10-30 00:00:00
+Thursday 2008-11-27 00:00:00
+Thursday 2008-12-25 00:00:00
+Thursday 2009-01-29 00:00:00
+Thursday 2009-02-26 00:00:00
+Thursday 2009-03-26 00:00:00
+Thursday 2009-04-30 00:00:00
+Thursday 2009-05-28 00:00:00
+Thursday 2009-06-25 00:00:00
+Thursday 2009-07-30 00:00:00
+Thursday 2009-08-27 00:00:00
+Thursday 2009-09-24 00:00:00
+Thursday 2009-10-29 00:00:00
+Thursday 2009-11-26 00:00:00
+Thursday 2009-12-31 00:00:00
+============================
+DatePeriod (clone)
+Thursday 2008-01-31 00:00:00
+Thursday 2008-02-28 00:00:00
+Thursday 2008-03-27 00:00:00
+Thursday 2008-04-24 00:00:00
+Thursday 2008-05-29 00:00:00
+Thursday 2008-06-26 00:00:00
+Thursday 2008-07-31 00:00:00
+Thursday 2008-08-28 00:00:00
+Thursday 2008-09-25 00:00:00
+Thursday 2008-10-30 00:00:00
+Thursday 2008-11-27 00:00:00
+Thursday 2008-12-25 00:00:00
+Thursday 2009-01-29 00:00:00
+Thursday 2009-02-26 00:00:00
+Thursday 2009-03-26 00:00:00
+Thursday 2009-04-30 00:00:00
+Thursday 2009-05-28 00:00:00
+Thursday 2009-06-25 00:00:00
+Thursday 2009-07-30 00:00:00
+Thursday 2009-08-27 00:00:00
+Thursday 2009-09-24 00:00:00
+Thursday 2009-10-29 00:00:00
+Thursday 2009-11-26 00:00:00
+Thursday 2009-12-31 00:00:00
+============================
Previous Comments:
------------------------------------------------------------------------
[2009-12-23 12:04:54] sr at emini dot dk
Description:
------------
I am unable to clone an object of type DateInterval or DatePeriod. The
clone appears to be an empty object.
I've looked in the source and the code to clone the objects seem to be
missing from both date_object_clone_interval() and
date_object_clone_period().
Reproduce code:
---------------
$dateInterval1 = new \DateInterval('P1D');
$dateInterval2 = clone $dateInterval;
var_dump($dateInterval1);
var_dump($dateInterval2);
Expected result:
----------------
$dateInterval2 should be a clone of $dateInterval1.
Actual result:
--------------
$dateInterval1 works as expected, but $dateInterval2 appears to be an
empty object.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=50559&edit=1