diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 2721f4f026f..64b7fff2800 100755 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -700,13 +700,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/bug45622.phpt b/ext/spl/tests/bug45622.phpt new file mode 100644 index 00000000000..c47b62cbdfd --- /dev/null +++ b/ext/spl/tests/bug45622.phpt @@ -0,0 +1,51 @@ +--TEST-- +SPL: Bug #45622 (isset($arrayObject->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) +%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" +