mirror of
https://github.com/php/php-src.git
synced 2026-04-26 17:38:14 +02:00
Fix bug #45622 (isset($arrayObject->p) misbehaves with ArrayObject::ARRAY_AS_PROPS set)
This commit is contained in:
+5
-6
@@ -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) /* {{{ */
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
--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"
|
||||
|
||||
Reference in New Issue
Block a user