From: Felipe Pena Date: Sat, 3 May 2008 00:36:54 +0000 (+0000) Subject: - Fixed bug #44899 (__isset usage changes behavior of empty()) (patch by Etienne... X-Git-Tag: RELEASE_2_0_0b1~108 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c23bf369ece3dde45c83e6b7552fe58bc93de30b;p=php - Fixed bug #44899 (__isset usage changes behavior of empty()) (patch by Etienne Kneuss) --- diff --git a/Zend/tests/bug44899.phpt b/Zend/tests/bug44899.phpt new file mode 100644 index 0000000000..d62033a24e --- /dev/null +++ b/Zend/tests/bug44899.phpt @@ -0,0 +1,38 @@ +--TEST-- +Bug #44899 (__isset usage changes behavior of empty()) +--FILE-- +_data = $data; + } + + function __isset($field_name) + { + return isset($this->_data[$field_name]); + } +} + +$arr = array('foo' => ''); + +$myclass = new myclass($arr) ; + +echo (isset($myclass->foo)) ? 'isset' : 'not isset'; +echo "\n"; +echo (empty($myclass->foo)) ? 'empty' : 'not empty'; +echo "\n"; +echo ($myclass->foo) ? 'not empty' : 'empty'; +echo "\n"; + +?> +--EXPECTF-- +isset +empty + +Notice: Undefined property: myclass::$foo in %s on line %d +empty diff --git a/Zend/tests/bug44899_2.phpt b/Zend/tests/bug44899_2.phpt new file mode 100644 index 0000000000..e98714929b --- /dev/null +++ b/Zend/tests/bug44899_2.phpt @@ -0,0 +1,43 @@ +--TEST-- +Bug #44899 (__isset usage changes behavior of empty()) - 2 +--FILE-- +_data = $data; + } + + function __isset($field_name) + { + return isset($this->_data[$field_name]); + } + + function __get($var) { + var_dump(empty($this->_data[$var])); + return $this->_data[$var]; + } +} + +$arr = array('foo' => ''); + +$myclass = new myclass($arr) ; + +echo (isset($myclass->foo)) ? 'isset' : 'not isset'; +echo "\n"; +echo (empty($myclass->foo)) ? 'empty' : 'not empty'; +echo "\n"; +echo ($myclass->foo) ? 'not empty' : 'empty'; +echo "\n"; + +?> +--EXPECT-- +isset +bool(true) +empty +bool(true) +empty diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index a57883f807..db6c34391e 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1148,14 +1148,20 @@ static int zend_std_has_property(zval *object, zval *member, int has_set_exists if (rv) { result = zend_is_true(rv); zval_ptr_dtor(&rv); - if (has_set_exists && result && !EG(exception) && zobj->ce->__get && !guard->in_get) { - guard->in_get = 1; - rv = zend_std_call_getter(object, member TSRMLS_CC); - guard->in_get = 0; - if (rv) { - Z_ADDREF_P(rv); - result = i_zend_is_true(rv); - zval_ptr_dtor(&rv); + if (has_set_exists && result) { + if (!EG(exception) && zobj->ce->__get && !guard->in_get) { + guard->in_get = 1; + rv = zend_std_call_getter(object, member TSRMLS_CC); + guard->in_get = 0; + if (rv) { + Z_ADDREF_P(rv); + result = i_zend_is_true(rv); + zval_ptr_dtor(&rv); + } else { + result = 0; + } + } else { + result = 0; } } }