Skip to content

Commit bd6162c

Browse files
committed
Add DatePeriod unset handler
1 parent ceb6a95 commit bd6162c

File tree

3 files changed

+270
-11
lines changed

3 files changed

+270
-11
lines changed

ext/date/php_date.c

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ static zval *date_interval_get_property_ptr_ptr(zend_object *object, zend_string
363363
static zval *date_period_read_property(zend_object *object, zend_string *name, int type, void **cache_slot, zval *rv);
364364
static zval *date_period_write_property(zend_object *object, zend_string *name, zval *value, void **cache_slot);
365365
static zval *date_period_get_property_ptr_ptr(zend_object *object, zend_string *name, int type, void **cache_slot);
366+
static void date_period_unset_property(zend_object *object, zend_string *name, void **cache_slot);
366367
static HashTable *date_period_get_properties_for(zend_object *object, zend_prop_purpose purpose);
367368
static int date_object_compare_timezone(zval *tz1, zval *tz2);
368369

@@ -1798,6 +1799,7 @@ static void date_register_classes(void) /* {{{ */
17981799
date_object_handlers_period.read_property = date_period_read_property;
17991800
date_object_handlers_period.write_property = date_period_write_property;
18001801
date_object_handlers_period.get_properties_for = date_period_get_properties_for;
1802+
date_object_handlers_period.unset_property = date_period_unset_property;
18011803

18021804
date_ce_date_error = register_class_DateError(zend_ce_error);
18031805
date_ce_date_object_error = register_class_DateObjectError(date_ce_date_error);
@@ -5985,17 +5987,6 @@ static zval *date_period_get_property_ptr_ptr(zend_object *object, zend_string *
59855987

59865988
static HashTable *date_period_get_properties_for(zend_object *object, zend_prop_purpose purpose)
59875989
{
5988-
switch (purpose) {
5989-
case ZEND_PROP_PURPOSE_DEBUG:
5990-
case ZEND_PROP_PURPOSE_SERIALIZE:
5991-
case ZEND_PROP_PURPOSE_VAR_EXPORT:
5992-
case ZEND_PROP_PURPOSE_JSON:
5993-
case ZEND_PROP_PURPOSE_ARRAY_CAST:
5994-
break;
5995-
default:
5996-
return zend_std_get_properties_for(object, purpose);
5997-
}
5998-
59995990
php_period_obj *period_obj = php_period_obj_from_obj(object);
60005991
HashTable *props = zend_array_dup(zend_std_get_properties(object));
60015992
if (!period_obj->initialized) {
@@ -6006,3 +5997,13 @@ static HashTable *date_period_get_properties_for(zend_object *object, zend_prop_
60065997

60075998
return props;
60085999
}
6000+
6001+
static void date_period_unset_property(zend_object *object, zend_string *name, void **cache_slot)
6002+
{
6003+
if (date_period_is_internal_property(name)) {
6004+
zend_throw_error(NULL, "Cannot unset %s::$%s", ZSTR_VAL(object->ce->name), ZSTR_VAL(name));
6005+
return;
6006+
}
6007+
6008+
zend_std_unset_property(object, name, cache_slot);
6009+
}
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
--TEST--
2+
Test different usages of DatePeriod properties
3+
--FILE--
4+
<?php
5+
6+
class MyDatePeriod extends DatePeriod {
7+
public int $prop = 3;
8+
}
9+
10+
$period = MyDatePeriod::createFromISO8601String("R4/2012-07-01T00:00:00Z/P7D");
11+
12+
var_dump($period);
13+
var_dump(json_encode($period));
14+
var_dump(serialize($period));
15+
var_dump(get_object_vars($period));
16+
var_dump(var_export($period));
17+
var_dump((array) ($period));
18+
19+
?>
20+
--EXPECTF--
21+
object(MyDatePeriod)#%d (%d) {
22+
["prop"]=>
23+
int(3)
24+
["start"]=>
25+
object(DateTimeImmutable)#%d (%d) {
26+
["date"]=>
27+
string(26) "2012-07-01 00:00:00.000000"
28+
["timezone_type"]=>
29+
int(1)
30+
["timezone"]=>
31+
string(6) "+00:00"
32+
}
33+
["current"]=>
34+
NULL
35+
["end"]=>
36+
NULL
37+
["interval"]=>
38+
object(DateInterval)#%d (%d) {
39+
["y"]=>
40+
int(0)
41+
["m"]=>
42+
int(0)
43+
["d"]=>
44+
int(7)
45+
["h"]=>
46+
int(0)
47+
["i"]=>
48+
int(0)
49+
["s"]=>
50+
int(0)
51+
["f"]=>
52+
float(0)
53+
["invert"]=>
54+
int(0)
55+
["days"]=>
56+
bool(false)
57+
["from_string"]=>
58+
bool(false)
59+
}
60+
["recurrences"]=>
61+
int(5)
62+
["include_start_date"]=>
63+
bool(true)
64+
["include_end_date"]=>
65+
bool(false)
66+
}
67+
string(%d) "{"prop":3,"start":{"date":"2012-07-01 00:00:00.000000","timezone_type":1,"timezone":"+00:00"},"current":null,"end":null,"interval":{"y":0,"m":0,"d":7,"h":0,"i":0,"s":0,"f":0,"invert":0,"days":false,"from_string":false},"recurrences":5,"include_start_date":true,"include_end_date":false}"
68+
string(%d) "O:12:"MyDatePeriod":8:{s:5:"start";O:17:"DateTimeImmutable":3:{s:4:"date";s:26:"2012-07-01 00:00:00.000000";s:13:"timezone_type";i:1;s:8:"timezone";s:6:"+00:00";}s:7:"current";N;s:3:"end";N;s:8:"interval";O:12:"DateInterval":10:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:7;s:1:"h";i:0;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:6:"invert";i:0;s:4:"days";b:0;s:11:"from_string";b:0;}s:11:"recurrences";i:5;s:18:"include_start_date";b:1;s:16:"include_end_date";b:0;s:4:"prop";i:3;}"
69+
array(%d) {
70+
["prop"]=>
71+
int(3)
72+
["start"]=>
73+
object(DateTimeImmutable)#%d (%d) {
74+
["date"]=>
75+
string(26) "2012-07-01 00:00:00.000000"
76+
["timezone_type"]=>
77+
int(1)
78+
["timezone"]=>
79+
string(6) "+00:00"
80+
}
81+
["current"]=>
82+
NULL
83+
["end"]=>
84+
NULL
85+
["interval"]=>
86+
object(DateInterval)#%d (%d) {
87+
["y"]=>
88+
int(0)
89+
["m"]=>
90+
int(0)
91+
["d"]=>
92+
int(7)
93+
["h"]=>
94+
int(0)
95+
["i"]=>
96+
int(0)
97+
["s"]=>
98+
int(0)
99+
["f"]=>
100+
float(0)
101+
["invert"]=>
102+
int(0)
103+
["days"]=>
104+
bool(false)
105+
["from_string"]=>
106+
bool(false)
107+
}
108+
["recurrences"]=>
109+
int(5)
110+
["include_start_date"]=>
111+
bool(true)
112+
["include_end_date"]=>
113+
bool(false)
114+
}
115+
\MyDatePeriod::__set_state(array(
116+
'prop' => 3,
117+
'start' =>
118+
\DateTimeImmutable::__set_state(array(
119+
'date' => '2012-07-01 00:00:00.000000',
120+
'timezone_type' => 1,
121+
'timezone' => '+00:00',
122+
)),
123+
'current' => NULL,
124+
'end' => NULL,
125+
'interval' =>
126+
\DateInterval::__set_state(array(
127+
'y' => 0,
128+
'm' => 0,
129+
'd' => 7,
130+
'h' => 0,
131+
'i' => 0,
132+
's' => 0,
133+
'f' => 0.0,
134+
'invert' => 0,
135+
'days' => false,
136+
'from_string' => false,
137+
)),
138+
'recurrences' => 5,
139+
'include_start_date' => true,
140+
'include_end_date' => false,
141+
))NULL
142+
array(%d) {
143+
["prop"]=>
144+
int(3)
145+
["start"]=>
146+
object(DateTimeImmutable)#%d (%d) {
147+
["date"]=>
148+
string(26) "2012-07-01 00:00:00.000000"
149+
["timezone_type"]=>
150+
int(1)
151+
["timezone"]=>
152+
string(6) "+00:00"
153+
}
154+
["current"]=>
155+
NULL
156+
["end"]=>
157+
NULL
158+
["interval"]=>
159+
object(DateInterval)#%d (%d) {
160+
["y"]=>
161+
int(0)
162+
["m"]=>
163+
int(0)
164+
["d"]=>
165+
int(7)
166+
["h"]=>
167+
int(0)
168+
["i"]=>
169+
int(0)
170+
["s"]=>
171+
int(0)
172+
["f"]=>
173+
float(0)
174+
["invert"]=>
175+
int(0)
176+
["days"]=>
177+
bool(false)
178+
["from_string"]=>
179+
bool(false)
180+
}
181+
["recurrences"]=>
182+
int(5)
183+
["include_start_date"]=>
184+
bool(true)
185+
["include_end_date"]=>
186+
bool(false)
187+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
--TEST--
2+
Test unsetting DatePeriod properties
3+
--FILE--
4+
<?php
5+
6+
class MyDatePeriod extends DatePeriod {
7+
public int $prop = 3;
8+
}
9+
10+
$period = new MyDatePeriod(new DateTimeImmutable("now"), DateInterval::createFromDateString("tomorrow"), 1);
11+
12+
unset($period->prop);
13+
14+
try {
15+
$period->prop;
16+
} catch (Error $e) {
17+
echo $e->getMessage(), "\n";
18+
}
19+
20+
try {
21+
unset($period->start);
22+
} catch (Error $e) {
23+
echo $e->getMessage(), "\n";
24+
}
25+
26+
try {
27+
unset($period->current);
28+
} catch (Error $e) {
29+
echo $e->getMessage(), "\n";
30+
}
31+
32+
try {
33+
unset($period->end);
34+
} catch (Error $e) {
35+
echo $e->getMessage(), "\n";
36+
}
37+
38+
try {
39+
unset($period->interval);
40+
} catch (Error $e) {
41+
echo $e->getMessage(), "\n";
42+
}
43+
44+
try {
45+
unset($period->recurrences);
46+
} catch (Error $e) {
47+
echo $e->getMessage(), "\n";
48+
}
49+
50+
try {
51+
unset($period->include_start_date);
52+
} catch (Error $e) {
53+
echo $e->getMessage(), "\n";
54+
}
55+
56+
try {
57+
unset($period->include_end_date);
58+
} catch (Error $e) {
59+
echo $e->getMessage(), "\n";
60+
}
61+
62+
?>
63+
--EXPECT--
64+
Typed property MyDatePeriod::$prop must not be accessed before initialization
65+
Cannot unset MyDatePeriod::$start
66+
Cannot unset MyDatePeriod::$current
67+
Cannot unset MyDatePeriod::$end
68+
Cannot unset MyDatePeriod::$interval
69+
Cannot unset MyDatePeriod::$recurrences
70+
Cannot unset MyDatePeriod::$include_start_date
71+
Cannot unset MyDatePeriod::$include_end_date

0 commit comments

Comments
 (0)