lbarnaud Sat Jul 26 12:33:34 2008 UTC Added files: /php-src/ext/spl/tests bug45622.phpt
Modified files: /php-src/ext/spl spl_array.c Log: Fix bug #45622 (isset($arrayObject->p) misbehaves with ArrayObject::ARRAY_AS_PROPS set) http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_array.c?r1=1.143&r2=1.144&diff_format=u Index: php-src/ext/spl/spl_array.c diff -u php-src/ext/spl/spl_array.c:1.143 php-src/ext/spl/spl_array.c:1.144 --- php-src/ext/spl/spl_array.c:1.143 Thu Jul 24 15:51:14 2008 +++ php-src/ext/spl/spl_array.c Sat Jul 26 12:33:34 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_array.c,v 1.143 2008/07/24 15:51:14 lbarnaud Exp $ */ +/* $Id: spl_array.c,v 1.144 2008/07/26 12:33:34 lbarnaud Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -700,13 +700,12 @@ { spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC); - if ((intern->ar_flags & SPL_ARRAY_ARRAY_AS_PROPS) != 0) { - if (!std_object_handlers.has_property(object, member, 2 TSRMLS_CC)) { - return spl_array_has_dimension(object, member, has_set_exists TSRMLS_CC); - } - return 0; /* if prop doesn't exist at all mode 0/1 cannot return 1 */ + if (std_object_handlers.has_property(object, member, has_set_exists TSRMLS_CC)) { + return 1; + } else if ((intern->ar_flags & SPL_ARRAY_ARRAY_AS_PROPS) != 0) { + return spl_array_has_dimension(object, member, has_set_exists TSRMLS_CC); } - return std_object_handlers.has_property(object, member, has_set_exists TSRMLS_CC); + return 0; } /* }}} */ static void spl_array_unset_property(zval *object, zval *member TSRMLS_DC) /* {{{ */ http://cvs.php.net/viewvc.cgi/php-src/ext/spl/tests/bug45622.phpt?view=markup&rev=1.1 Index: php-src/ext/spl/tests/bug45622.phpt +++ php-src/ext/spl/tests/bug45622.phpt --TEST-- SPL: Bug #45622 (isset($arrayObject->p) misbehaves with ArrayObject::ARRAY_AS_PROPS set --FILE-- <?php class C extends ArrayObject { public $p = 'object property'; } $ao = new C(array('p'=>'array element')); $ao->setFlags(ArrayObject::ARRAY_AS_PROPS); echo "\n--> Access the real property:\n"; var_dump(isset($ao->p)); var_dump($ao->p); echo "\n--> Remove the real property and access the array element:\n"; unset($ao->p); var_dump(isset($ao->p)); var_dump($ao->p); echo "\n--> Remove the array element and try access again:\n"; unset($ao->p); var_dump(isset($ao->p)); var_dump($ao->p); echo "\n--> Re-add the real property:\n"; $ao->p = 'object property'; var_dump(isset($ao->p)); var_dump($ao->p); ?> --EXPECTF-- --> Access the real property: bool(true) %unicode|string%(15) "object property" --> Remove the real property and access the array element: bool(true) %unicode|string%(13) "array element" --> Remove the array element and try access again: bool(false) Notice: Undefined index: p in %s on line %d NULL --> Re-add the real property: bool(true) %unicode|string%(15) "object property" -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php