@@ -2254,6 +2254,19 @@ static void date_object_free_storage_period(zend_object *object) /* {{{ */
2254
2254
zend_object_std_dtor (& intern -> std );
2255
2255
} /* }}} */
2256
2256
2257
+ static void add_common_properties (HashTable * myht , zend_object * zobj )
2258
+ {
2259
+ HashTable * common ;
2260
+ zend_string * name ;
2261
+ zval * prop ;
2262
+
2263
+ common = zend_std_get_properties (zobj );
2264
+
2265
+ ZEND_HASH_MAP_FOREACH_STR_KEY_VAL_IND (common , name , prop ) {
2266
+ zend_hash_add (myht , name , prop );
2267
+ } ZEND_HASH_FOREACH_END ();
2268
+ }
2269
+
2257
2270
/* Advanced Interface */
2258
2271
PHPAPI zval * php_date_instantiate (zend_class_entry * pce , zval * object ) /* {{{ */
2259
2272
{
@@ -2733,6 +2746,8 @@ PHP_METHOD(DateTime, __serialize)
2733
2746
array_init (return_value );
2734
2747
myht = Z_ARRVAL_P (return_value );
2735
2748
date_object_to_hash (dateobj , myht );
2749
+
2750
+ add_common_properties (myht , & dateobj -> std );
2736
2751
}
2737
2752
/* }}} */
2738
2753
@@ -2751,9 +2766,36 @@ PHP_METHOD(DateTimeImmutable, __serialize)
2751
2766
array_init (return_value );
2752
2767
myht = Z_ARRVAL_P (return_value );
2753
2768
date_object_to_hash (dateobj , myht );
2769
+
2770
+ add_common_properties (myht , & dateobj -> std );
2754
2771
}
2755
2772
/* }}} */
2756
2773
2774
+ static bool date_time_is_internal_property (zend_string * name )
2775
+ {
2776
+ if (
2777
+ zend_string_equals_literal (name , "date" ) ||
2778
+ zend_string_equals_literal (name , "timezone_type" ) ||
2779
+ zend_string_equals_literal (name , "timezone" )
2780
+ ) {
2781
+ return 1 ;
2782
+ }
2783
+ return 0 ;
2784
+ }
2785
+
2786
+ static void restore_custom_datetime_properties (zval * object , HashTable * myht )
2787
+ {
2788
+ zend_string * prop_name ;
2789
+ zval * prop_val ;
2790
+
2791
+ ZEND_HASH_MAP_FOREACH_STR_KEY_VAL (myht , prop_name , prop_val ) {
2792
+ if (date_time_is_internal_property (prop_name )) {
2793
+ continue ;
2794
+ }
2795
+ add_property_zval_ex (object , ZSTR_VAL (prop_name ), ZSTR_LEN (prop_name ), prop_val );
2796
+ } ZEND_HASH_FOREACH_END ();
2797
+ }
2798
+
2757
2799
/* {{{ */
2758
2800
PHP_METHOD (DateTime , __unserialize )
2759
2801
{
@@ -2772,6 +2814,8 @@ PHP_METHOD(DateTime, __unserialize)
2772
2814
if (!php_date_initialize_from_hash (& dateobj , myht )) {
2773
2815
zend_throw_error (NULL , "Invalid serialization data for DateTime object" );
2774
2816
}
2817
+
2818
+ restore_custom_datetime_properties (object , myht );
2775
2819
}
2776
2820
/* }}} */
2777
2821
@@ -2793,6 +2837,8 @@ PHP_METHOD(DateTimeImmutable, __unserialize)
2793
2837
if (!php_date_initialize_from_hash (& dateobj , myht )) {
2794
2838
zend_throw_error (NULL , "Invalid serialization data for DateTimeImmutable object" );
2795
2839
}
2840
+
2841
+ restore_custom_datetime_properties (object , myht );
2796
2842
}
2797
2843
/* }}} */
2798
2844
@@ -3753,9 +3799,35 @@ PHP_METHOD(DateTimeZone, __serialize)
3753
3799
array_init (return_value );
3754
3800
myht = Z_ARRVAL_P (return_value );
3755
3801
date_timezone_object_to_hash (tzobj , myht );
3802
+
3803
+ add_common_properties (myht , & tzobj -> std );
3756
3804
}
3757
3805
/* }}} */
3758
3806
3807
+ static bool date_timezone_is_internal_property (zend_string * name )
3808
+ {
3809
+ if (
3810
+ zend_string_equals_literal (name , "timezone_type" ) ||
3811
+ zend_string_equals_literal (name , "timezone" )
3812
+ ) {
3813
+ return 1 ;
3814
+ }
3815
+ return 0 ;
3816
+ }
3817
+
3818
+ static void restore_custom_datetimezone_properties (zval * object , HashTable * myht )
3819
+ {
3820
+ zend_string * prop_name ;
3821
+ zval * prop_val ;
3822
+
3823
+ ZEND_HASH_MAP_FOREACH_STR_KEY_VAL (myht , prop_name , prop_val ) {
3824
+ if (date_timezone_is_internal_property (prop_name )) {
3825
+ continue ;
3826
+ }
3827
+ add_property_zval_ex (object , ZSTR_VAL (prop_name ), ZSTR_LEN (prop_name ), prop_val );
3828
+ } ZEND_HASH_FOREACH_END ();
3829
+ }
3830
+
3759
3831
/* {{{ */
3760
3832
PHP_METHOD (DateTimeZone , __unserialize )
3761
3833
{
@@ -3774,6 +3846,8 @@ PHP_METHOD(DateTimeZone, __unserialize)
3774
3846
if (!php_date_timezone_initialize_from_hash (& object , & tzobj , myht )) {
3775
3847
zend_throw_error (NULL , "Invalid serialization data for DateTimeZone object" );
3776
3848
}
3849
+
3850
+ restore_custom_datetimezone_properties (object , myht );
3777
3851
}
3778
3852
/* }}} */
3779
3853
@@ -4344,9 +4418,44 @@ PHP_METHOD(DateInterval, __serialize)
4344
4418
array_init (return_value );
4345
4419
myht = Z_ARRVAL_P (return_value );
4346
4420
date_interval_object_to_hash (intervalobj , myht );
4421
+
4422
+ add_common_properties (myht , & intervalobj -> std );
4347
4423
}
4348
4424
/* }}} */
4349
4425
4426
+ static bool date_interval_is_internal_property (zend_string * name )
4427
+ {
4428
+ if (
4429
+ zend_string_equals_literal (name , "date_string" ) ||
4430
+ zend_string_equals_literal (name , "from_string" ) ||
4431
+ zend_string_equals_literal (name , "y" ) ||
4432
+ zend_string_equals_literal (name , "m" ) ||
4433
+ zend_string_equals_literal (name , "d" ) ||
4434
+ zend_string_equals_literal (name , "h" ) ||
4435
+ zend_string_equals_literal (name , "i" ) ||
4436
+ zend_string_equals_literal (name , "s" ) ||
4437
+ zend_string_equals_literal (name , "f" ) ||
4438
+ zend_string_equals_literal (name , "invert" ) ||
4439
+ zend_string_equals_literal (name , "days" )
4440
+ ) {
4441
+ return 1 ;
4442
+ }
4443
+ return 0 ;
4444
+ }
4445
+
4446
+ static void restore_custom_dateinterval_properties (zval * object , HashTable * myht )
4447
+ {
4448
+ zend_string * prop_name ;
4449
+ zval * prop_val ;
4450
+
4451
+ ZEND_HASH_MAP_FOREACH_STR_KEY_VAL (myht , prop_name , prop_val ) {
4452
+ if (date_interval_is_internal_property (prop_name )) {
4453
+ continue ;
4454
+ }
4455
+ add_property_zval_ex (object , ZSTR_VAL (prop_name ), ZSTR_LEN (prop_name ), prop_val );
4456
+ } ZEND_HASH_FOREACH_END ();
4457
+ }
4458
+
4350
4459
4351
4460
/* {{{ */
4352
4461
PHP_METHOD (DateInterval , __unserialize )
@@ -4364,6 +4473,7 @@ PHP_METHOD(DateInterval, __unserialize)
4364
4473
myht = Z_ARRVAL_P (array );
4365
4474
4366
4475
php_date_interval_initialize_from_hash (& object , & intervalobj , myht );
4476
+ restore_custom_dateinterval_properties (object , myht );
4367
4477
}
4368
4478
/* }}} */
4369
4479
@@ -5269,9 +5379,44 @@ PHP_METHOD(DatePeriod, __serialize)
5269
5379
array_init (return_value );
5270
5380
myht = Z_ARRVAL_P (return_value );
5271
5381
date_period_object_to_hash (period_obj , myht );
5382
+
5383
+ add_common_properties (myht , & period_obj -> std );
5272
5384
}
5273
5385
/* }}} */
5274
5386
5387
+ /* {{{ date_period_is_internal_property
5388
+ * Common for date_period_read_property(), date_period_write_property(), and
5389
+ * restore_custom_dateperiod_properties functions
5390
+ */
5391
+ static bool date_period_is_internal_property (zend_string * name )
5392
+ {
5393
+ if (
5394
+ zend_string_equals_literal (name , "start" ) ||
5395
+ zend_string_equals_literal (name , "current" ) ||
5396
+ zend_string_equals_literal (name , "end" ) ||
5397
+ zend_string_equals_literal (name , "interval" ) ||
5398
+ zend_string_equals_literal (name , "recurrences" ) ||
5399
+ zend_string_equals_literal (name , "include_start_date" ) ||
5400
+ zend_string_equals_literal (name , "include_end_date" )
5401
+ ) {
5402
+ return 1 ;
5403
+ }
5404
+ return 0 ;
5405
+ }
5406
+ /* }}} */
5407
+
5408
+ static void restore_custom_dateperiod_properties (zval * object , HashTable * myht )
5409
+ {
5410
+ zend_string * prop_name ;
5411
+ zval * prop_val ;
5412
+
5413
+ ZEND_HASH_MAP_FOREACH_STR_KEY_VAL (myht , prop_name , prop_val ) {
5414
+ if (date_period_is_internal_property (prop_name )) {
5415
+ continue ;
5416
+ }
5417
+ add_property_zval_ex (object , ZSTR_VAL (prop_name ), ZSTR_LEN (prop_name ), prop_val );
5418
+ } ZEND_HASH_FOREACH_END ();
5419
+ }
5275
5420
5276
5421
/* {{{ */
5277
5422
PHP_METHOD (DatePeriod , __unserialize )
@@ -5291,6 +5436,7 @@ PHP_METHOD(DatePeriod, __unserialize)
5291
5436
if (!php_date_period_initialize_from_hash (period_obj , myht )) {
5292
5437
zend_throw_error (NULL , "Invalid serialization data for DatePeriod object" );
5293
5438
}
5439
+ restore_custom_dateperiod_properties (object , myht );
5294
5440
}
5295
5441
/* }}} */
5296
5442
@@ -5313,25 +5459,6 @@ PHP_METHOD(DatePeriod, __wakeup)
5313
5459
}
5314
5460
/* }}} */
5315
5461
5316
- /* {{{ date_period_is_internal_property
5317
- * Common for date_period_read_property() and date_period_write_property() functions
5318
- */
5319
- static bool date_period_is_internal_property (zend_string * name )
5320
- {
5321
- if (zend_string_equals_literal (name , "recurrences" )
5322
- || zend_string_equals_literal (name , "include_start_date" )
5323
- || zend_string_equals_literal (name , "include_end_date" )
5324
- || zend_string_equals_literal (name , "start" )
5325
- || zend_string_equals_literal (name , "current" )
5326
- || zend_string_equals_literal (name , "end" )
5327
- || zend_string_equals_literal (name , "interval" )
5328
- ) {
5329
- return 1 ;
5330
- }
5331
- return 0 ;
5332
- }
5333
- /* }}} */
5334
-
5335
5462
/* {{{ date_period_read_property */
5336
5463
static zval * date_period_read_property (zend_object * object , zend_string * name , int type , void * * cache_slot , zval * rv )
5337
5464
{
0 commit comments