{
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) /* {{{ */
--- /dev/null
+--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"
+