From: Arnaud Le Blanc Date: Thu, 14 May 2009 16:44:54 +0000 (+0000) Subject: MFB: Fixed bug #45622 (isset($arrayObject->p) misbehaves with X-Git-Tag: php-5.2.10RC1~79 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4710871ab8e0771a00769909b96304b244295405;p=php MFB: Fixed bug #45622 (isset($arrayObject->p) misbehaves with ArrayObject::ARRAY_AS_PROPS set) --- diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 08f391b956..b9c7867483 100755 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -671,13 +671,12 @@ static int spl_array_has_property(zval *object, zval *member, int has_set_exists { 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) /* {{{ */ diff --git a/ext/spl/tests/arrayObject___construct_basic4.phpt b/ext/spl/tests/arrayObject___construct_basic4.phpt index 5bc7732ff3..d53896dade 100644 --- a/ext/spl/tests/arrayObject___construct_basic4.phpt +++ b/ext/spl/tests/arrayObject___construct_basic4.phpt @@ -1,7 +1,5 @@ --TEST-- SPL: ArrayObject::__construct basic usage with ArrayObject::ARRAY_AS_PROPS. ---XFAIL-- -Will fail until the fix to bug 45622 is backported from PHP53 to PHP52. --FILE-- isset existent, non-existent and dynamic: +In UsesMagic::__isset(a) bool(true) +In UsesMagic::__isset(nonexistent) bool(false) +In UsesMagic::__isset(dynamic) bool(true) Original wrapped object: object(C)#%d (5) { @@ -183,4 +186,4 @@ object(UsesMagic)#%d (3) { int(3) ["priv:private"]=> string(6) "secret" -} \ No newline at end of file +} diff --git a/ext/spl/tests/arrayObject_setFlags_basic1.phpt b/ext/spl/tests/arrayObject_setFlags_basic1.phpt index e3e97f3b53..41f2afa95f 100644 --- a/ext/spl/tests/arrayObject_setFlags_basic1.phpt +++ b/ext/spl/tests/arrayObject_setFlags_basic1.phpt @@ -1,7 +1,5 @@ --TEST-- SPL: ArrayObject::setFlags basic usage with ArrayObject::ARRAY_AS_PROPS. ---XFAIL-- -Currently fails on php.net due to bug 45622. --FILE-- p) misbehaves with ArrayObject::ARRAY_AS_PROPS set +--FILE-- +'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) +string(15) "object property" + +--> Remove the real property and access the array element: +bool(true) +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) +string(15) "object property" +