]> granicus.if.org Git - php/commitdiff
- Fixed bug #44899 (__isset usage changes behavior of empty()) (patch by Etienne...
authorFelipe Pena <felipe@php.net>
Sat, 3 May 2008 00:36:54 +0000 (00:36 +0000)
committerFelipe Pena <felipe@php.net>
Sat, 3 May 2008 00:36:54 +0000 (00:36 +0000)
Zend/tests/bug44899.phpt [new file with mode: 0644]
Zend/tests/bug44899_2.phpt [new file with mode: 0644]
Zend/zend_object_handlers.c

diff --git a/Zend/tests/bug44899.phpt b/Zend/tests/bug44899.phpt
new file mode 100644 (file)
index 0000000..d62033a
--- /dev/null
@@ -0,0 +1,38 @@
+--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
diff --git a/Zend/tests/bug44899_2.phpt b/Zend/tests/bug44899_2.phpt
new file mode 100644 (file)
index 0000000..e987149
--- /dev/null
@@ -0,0 +1,43 @@
+--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
index a57883f80728c9c25e7cebb62dbedd459285170c..db6c34391e26b82a296e06d6f52c4921761fc164 100644 (file)
@@ -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;
                                        }
                                }
                        }