mirror of
https://github.com/php/php-src.git
synced 2024-09-21 09:57:23 +00:00
Add DatePeriod unset handler
This commit is contained in:
parent
ceb6a95d84
commit
bd6162c84a
@ -363,6 +363,7 @@ static zval *date_interval_get_property_ptr_ptr(zend_object *object, zend_string
|
||||
static zval *date_period_read_property(zend_object *object, zend_string *name, int type, void **cache_slot, zval *rv);
|
||||
static zval *date_period_write_property(zend_object *object, zend_string *name, zval *value, void **cache_slot);
|
||||
static zval *date_period_get_property_ptr_ptr(zend_object *object, zend_string *name, int type, void **cache_slot);
|
||||
static void date_period_unset_property(zend_object *object, zend_string *name, void **cache_slot);
|
||||
static HashTable *date_period_get_properties_for(zend_object *object, zend_prop_purpose purpose);
|
||||
static int date_object_compare_timezone(zval *tz1, zval *tz2);
|
||||
|
||||
@ -1798,6 +1799,7 @@ static void date_register_classes(void) /* {{{ */
|
||||
date_object_handlers_period.read_property = date_period_read_property;
|
||||
date_object_handlers_period.write_property = date_period_write_property;
|
||||
date_object_handlers_period.get_properties_for = date_period_get_properties_for;
|
||||
date_object_handlers_period.unset_property = date_period_unset_property;
|
||||
|
||||
date_ce_date_error = register_class_DateError(zend_ce_error);
|
||||
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 *
|
||||
|
||||
static HashTable *date_period_get_properties_for(zend_object *object, zend_prop_purpose purpose)
|
||||
{
|
||||
switch (purpose) {
|
||||
case ZEND_PROP_PURPOSE_DEBUG:
|
||||
case ZEND_PROP_PURPOSE_SERIALIZE:
|
||||
case ZEND_PROP_PURPOSE_VAR_EXPORT:
|
||||
case ZEND_PROP_PURPOSE_JSON:
|
||||
case ZEND_PROP_PURPOSE_ARRAY_CAST:
|
||||
break;
|
||||
default:
|
||||
return zend_std_get_properties_for(object, purpose);
|
||||
}
|
||||
|
||||
php_period_obj *period_obj = php_period_obj_from_obj(object);
|
||||
HashTable *props = zend_array_dup(zend_std_get_properties(object));
|
||||
if (!period_obj->initialized) {
|
||||
@ -6006,3 +5997,13 @@ static HashTable *date_period_get_properties_for(zend_object *object, zend_prop_
|
||||
|
||||
return props;
|
||||
}
|
||||
|
||||
static void date_period_unset_property(zend_object *object, zend_string *name, void **cache_slot)
|
||||
{
|
||||
if (date_period_is_internal_property(name)) {
|
||||
zend_throw_error(NULL, "Cannot unset %s::$%s", ZSTR_VAL(object->ce->name), ZSTR_VAL(name));
|
||||
return;
|
||||
}
|
||||
|
||||
zend_std_unset_property(object, name, cache_slot);
|
||||
}
|
||||
|
187
ext/date/tests/date_period_properties.phpt
Normal file
187
ext/date/tests/date_period_properties.phpt
Normal file
@ -0,0 +1,187 @@
|
||||
--TEST--
|
||||
Test different usages of DatePeriod properties
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class MyDatePeriod extends DatePeriod {
|
||||
public int $prop = 3;
|
||||
}
|
||||
|
||||
$period = MyDatePeriod::createFromISO8601String("R4/2012-07-01T00:00:00Z/P7D");
|
||||
|
||||
var_dump($period);
|
||||
var_dump(json_encode($period));
|
||||
var_dump(serialize($period));
|
||||
var_dump(get_object_vars($period));
|
||||
var_dump(var_export($period));
|
||||
var_dump((array) ($period));
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
object(MyDatePeriod)#%d (%d) {
|
||||
["prop"]=>
|
||||
int(3)
|
||||
["start"]=>
|
||||
object(DateTimeImmutable)#%d (%d) {
|
||||
["date"]=>
|
||||
string(26) "2012-07-01 00:00:00.000000"
|
||||
["timezone_type"]=>
|
||||
int(1)
|
||||
["timezone"]=>
|
||||
string(6) "+00:00"
|
||||
}
|
||||
["current"]=>
|
||||
NULL
|
||||
["end"]=>
|
||||
NULL
|
||||
["interval"]=>
|
||||
object(DateInterval)#%d (%d) {
|
||||
["y"]=>
|
||||
int(0)
|
||||
["m"]=>
|
||||
int(0)
|
||||
["d"]=>
|
||||
int(7)
|
||||
["h"]=>
|
||||
int(0)
|
||||
["i"]=>
|
||||
int(0)
|
||||
["s"]=>
|
||||
int(0)
|
||||
["f"]=>
|
||||
float(0)
|
||||
["invert"]=>
|
||||
int(0)
|
||||
["days"]=>
|
||||
bool(false)
|
||||
["from_string"]=>
|
||||
bool(false)
|
||||
}
|
||||
["recurrences"]=>
|
||||
int(5)
|
||||
["include_start_date"]=>
|
||||
bool(true)
|
||||
["include_end_date"]=>
|
||||
bool(false)
|
||||
}
|
||||
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}"
|
||||
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;}"
|
||||
array(%d) {
|
||||
["prop"]=>
|
||||
int(3)
|
||||
["start"]=>
|
||||
object(DateTimeImmutable)#%d (%d) {
|
||||
["date"]=>
|
||||
string(26) "2012-07-01 00:00:00.000000"
|
||||
["timezone_type"]=>
|
||||
int(1)
|
||||
["timezone"]=>
|
||||
string(6) "+00:00"
|
||||
}
|
||||
["current"]=>
|
||||
NULL
|
||||
["end"]=>
|
||||
NULL
|
||||
["interval"]=>
|
||||
object(DateInterval)#%d (%d) {
|
||||
["y"]=>
|
||||
int(0)
|
||||
["m"]=>
|
||||
int(0)
|
||||
["d"]=>
|
||||
int(7)
|
||||
["h"]=>
|
||||
int(0)
|
||||
["i"]=>
|
||||
int(0)
|
||||
["s"]=>
|
||||
int(0)
|
||||
["f"]=>
|
||||
float(0)
|
||||
["invert"]=>
|
||||
int(0)
|
||||
["days"]=>
|
||||
bool(false)
|
||||
["from_string"]=>
|
||||
bool(false)
|
||||
}
|
||||
["recurrences"]=>
|
||||
int(5)
|
||||
["include_start_date"]=>
|
||||
bool(true)
|
||||
["include_end_date"]=>
|
||||
bool(false)
|
||||
}
|
||||
\MyDatePeriod::__set_state(array(
|
||||
'prop' => 3,
|
||||
'start' =>
|
||||
\DateTimeImmutable::__set_state(array(
|
||||
'date' => '2012-07-01 00:00:00.000000',
|
||||
'timezone_type' => 1,
|
||||
'timezone' => '+00:00',
|
||||
)),
|
||||
'current' => NULL,
|
||||
'end' => NULL,
|
||||
'interval' =>
|
||||
\DateInterval::__set_state(array(
|
||||
'y' => 0,
|
||||
'm' => 0,
|
||||
'd' => 7,
|
||||
'h' => 0,
|
||||
'i' => 0,
|
||||
's' => 0,
|
||||
'f' => 0.0,
|
||||
'invert' => 0,
|
||||
'days' => false,
|
||||
'from_string' => false,
|
||||
)),
|
||||
'recurrences' => 5,
|
||||
'include_start_date' => true,
|
||||
'include_end_date' => false,
|
||||
))NULL
|
||||
array(%d) {
|
||||
["prop"]=>
|
||||
int(3)
|
||||
["start"]=>
|
||||
object(DateTimeImmutable)#%d (%d) {
|
||||
["date"]=>
|
||||
string(26) "2012-07-01 00:00:00.000000"
|
||||
["timezone_type"]=>
|
||||
int(1)
|
||||
["timezone"]=>
|
||||
string(6) "+00:00"
|
||||
}
|
||||
["current"]=>
|
||||
NULL
|
||||
["end"]=>
|
||||
NULL
|
||||
["interval"]=>
|
||||
object(DateInterval)#%d (%d) {
|
||||
["y"]=>
|
||||
int(0)
|
||||
["m"]=>
|
||||
int(0)
|
||||
["d"]=>
|
||||
int(7)
|
||||
["h"]=>
|
||||
int(0)
|
||||
["i"]=>
|
||||
int(0)
|
||||
["s"]=>
|
||||
int(0)
|
||||
["f"]=>
|
||||
float(0)
|
||||
["invert"]=>
|
||||
int(0)
|
||||
["days"]=>
|
||||
bool(false)
|
||||
["from_string"]=>
|
||||
bool(false)
|
||||
}
|
||||
["recurrences"]=>
|
||||
int(5)
|
||||
["include_start_date"]=>
|
||||
bool(true)
|
||||
["include_end_date"]=>
|
||||
bool(false)
|
||||
}
|
71
ext/date/tests/date_period_unset_property.phpt
Normal file
71
ext/date/tests/date_period_unset_property.phpt
Normal file
@ -0,0 +1,71 @@
|
||||
--TEST--
|
||||
Test unsetting DatePeriod properties
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class MyDatePeriod extends DatePeriod {
|
||||
public int $prop = 3;
|
||||
}
|
||||
|
||||
$period = new MyDatePeriod(new DateTimeImmutable("now"), DateInterval::createFromDateString("tomorrow"), 1);
|
||||
|
||||
unset($period->prop);
|
||||
|
||||
try {
|
||||
$period->prop;
|
||||
} catch (Error $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
|
||||
try {
|
||||
unset($period->start);
|
||||
} catch (Error $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
|
||||
try {
|
||||
unset($period->current);
|
||||
} catch (Error $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
|
||||
try {
|
||||
unset($period->end);
|
||||
} catch (Error $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
|
||||
try {
|
||||
unset($period->interval);
|
||||
} catch (Error $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
|
||||
try {
|
||||
unset($period->recurrences);
|
||||
} catch (Error $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
|
||||
try {
|
||||
unset($period->include_start_date);
|
||||
} catch (Error $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
|
||||
try {
|
||||
unset($period->include_end_date);
|
||||
} catch (Error $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
Typed property MyDatePeriod::$prop must not be accessed before initialization
|
||||
Cannot unset MyDatePeriod::$start
|
||||
Cannot unset MyDatePeriod::$current
|
||||
Cannot unset MyDatePeriod::$end
|
||||
Cannot unset MyDatePeriod::$interval
|
||||
Cannot unset MyDatePeriod::$recurrences
|
||||
Cannot unset MyDatePeriod::$include_start_date
|
||||
Cannot unset MyDatePeriod::$include_end_date
|
Loading…
Reference in New Issue
Block a user