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