--- /dev/null
+--TEST--
+Bug #44899 (__isset usage changes behavior of empty())
+--FILE--
+<?php
+
+class myclass
+{
+ private $_data = array();
+
+ function __construct($data)
+ {
+ $this->_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
--- /dev/null
+--TEST--
+Bug #44899 (__isset usage changes behavior of empty()) - 2
+--FILE--
+<?php
+
+class myclass
+{
+ private $_data = array();
+
+ function __construct($data)
+ {
+ $this->_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
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;
}
}
}