Skip to content

Commit 77efe76

Browse files
committed
Merge branch 'PHP-7.0' into PHP-7.1
* PHP-7.0: news entry for #1787 move declaration of vars to top add test for #69587 fix bug #69587 DateInterval properties and isset
2 parents 011afaf + 84e2904 commit 77efe76

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ PHP NEWS
3030
. Introduced encoder struct instead of global which fixes bugs #66025 and
3131
#73254 related to pretty print indentation. (Jakub Zelenka)
3232

33+
- Date:
34+
. Fixed bug #69587 (DateInterval properties and isset). (jhdxr)
35+
3336
- ODBC:
3437
. Fixed bug #73448 (odbc_errormsg returns trash, always 513 bytes).
3538
(Anatol)

ext/date/php_date.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1982,6 +1982,54 @@ static int implement_date_interface_handler(zend_class_entry *interface, zend_cl
19821982
return SUCCESS;
19831983
} /* }}} */
19841984

1985+
static int date_interval_has_property(zval *object, zval *member, int type, void **cache_slot) /* {{{ */
1986+
{
1987+
php_interval_obj *obj;
1988+
zval tmp_member;
1989+
zval rv;
1990+
zval *prop;
1991+
int retval = 0;
1992+
1993+
if (Z_TYPE_P(member) != IS_STRING) {
1994+
ZVAL_COPY(&tmp_member, member);
1995+
convert_to_string(&tmp_member);
1996+
member = &tmp_member;
1997+
cache_slot = NULL;
1998+
}
1999+
2000+
obj = Z_PHPINTERVAL_P(object);
2001+
2002+
if (!obj->initialized) {
2003+
retval = (zend_get_std_object_handlers())->has_property(object, member, type, cache_slot);
2004+
if (member == &tmp_member) {
2005+
zval_dtor(member);
2006+
}
2007+
return retval;
2008+
}
2009+
2010+
prop = date_interval_read_property(object, member, type, cache_slot, &rv);
2011+
2012+
if (prop != NULL) {
2013+
if (type == 2) {
2014+
retval = 1;
2015+
} else if (type == 1) {
2016+
retval = zend_is_true(prop);
2017+
} else if (type == 0) {
2018+
retval = (Z_TYPE(*prop) != IS_NULL);
2019+
}
2020+
} else {
2021+
retval = (zend_get_std_object_handlers())->has_property(object, member, type, cache_slot);
2022+
}
2023+
2024+
if (member == &tmp_member) {
2025+
zval_dtor(member);
2026+
}
2027+
2028+
return retval;
2029+
2030+
}
2031+
/* }}} */
2032+
19852033
static void date_register_classes(void) /* {{{ */
19862034
{
19872035
zend_class_entry ce_date, ce_immutable, ce_timezone, ce_interval, ce_period, ce_interface;
@@ -2063,6 +2111,7 @@ static void date_register_classes(void) /* {{{ */
20632111
date_object_handlers_interval.offset = XtOffsetOf(php_interval_obj, std);
20642112
date_object_handlers_interval.free_obj = date_object_free_storage_interval;
20652113
date_object_handlers_interval.clone_obj = date_object_clone_interval;
2114+
date_object_handlers_interval.has_property = date_interval_has_property;
20662115
date_object_handlers_interval.read_property = date_interval_read_property;
20672116
date_object_handlers_interval.write_property = date_interval_write_property;
20682117
date_object_handlers_interval.get_properties = date_object_get_properties_interval;

ext/date/tests/bug69587.phpt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
Bug #69587 (DateInterval properties and isset)
3+
--FILE--
4+
<?php
5+
$datetime1 = new DateTime('2009-10-11');
6+
$datetime2 = new DateTime('2009-10-13');
7+
$interval = $datetime1->diff($datetime2);
8+
9+
var_dump(property_exists($interval, 'm'), isset($interval->m), empty($interval->m), empty($interval->d));
10+
?>
11+
--EXPECT--
12+
bool(true)
13+
bool(true)
14+
bool(true)
15+
bool(false)

0 commit comments

Comments
 (0)