]> granicus.if.org Git - php/commitdiff
Fixed bug #34893 (PHP5.1 overloading, Cannot access private property)
authorDmitry Stogov <dmitry@php.net>
Thu, 20 Oct 2005 09:47:12 +0000 (09:47 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 20 Oct 2005 09:47:12 +0000 (09:47 +0000)
NEWS
Zend/tests/bug34893.phpt [new file with mode: 0755]
Zend/zend_object_handlers.c

diff --git a/NEWS b/NEWS
index 93d00d02c34817d0f7b35c5d620c62cfa033e208..32de2e4ef4448920310e1d771b3f8fb6ddc9d949 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,8 @@ PHP                                                                        NEWS
 ?? Oct 2005, PHP 5.1 Release Candidate 4
 - Fixed bug #34905 (Digest authentication does not work with Apache 1). (Ilia)
 - Fixed bug #34902 (mysqli::character_set_name() - undefined method). (Tony)
+- Fixed bug #34893 (PHP5.1 overloading, Cannot access private property).
+  (Dmitry)
 - Fixed bug #34899 (Fixed sqlite extension compile failure). (Ilia)
 - Fixed bug #34767 (Zend Engine 1 Compatibility not copying objects correctly).
   (Dmitry)
diff --git a/Zend/tests/bug34893.phpt b/Zend/tests/bug34893.phpt
new file mode 100755 (executable)
index 0000000..bbe0235
--- /dev/null
@@ -0,0 +1,33 @@
+--TEST--
+Bug #34893 (PHP5.1 overloading, Cannot access private property)
+--FILE--
+<?php
+class A {
+       private $p;
+       function __get($name){
+               return $this->$name;
+       }
+       function __set($name, $value) {
+               $this->$name = $value;
+       }
+}
+class B {
+       private $t;
+       function __get($name){
+               return $this->$name;
+       }
+       function __set($name, $value) {
+               $this->$name = $value;
+       }
+}
+$a = new A;
+$b = new B;
+$a->p = $b;
+$b->t = "foo";
+
+echo $a->p->t;
+$a->p->t = "bar";
+echo $a->p->t;
+?>
+--EXPECT--
+foobar
index 89cf73686a846e3a80558f68ddd3a6c3c6f912c1..49b5e1d6cf4523cb633edff7c59d7be87af0aa7a 100644 (file)
@@ -482,8 +482,10 @@ static zval **zend_std_get_property_ptr_ptr(zval *object, zval *member TSRMLS_DC
        zval tmp_member;
        zval **retval;
        zend_property_info *property_info;
+       zend_bool use_get;
        
        zobj = Z_OBJ_P(object);
+       use_get = (zobj->ce->__get && !zobj->in_get);
 
        if (member->type != IS_STRING) {
                tmp_member = *member;
@@ -496,12 +498,12 @@ static zval **zend_std_get_property_ptr_ptr(zval *object, zval *member TSRMLS_DC
        fprintf(stderr, "Ptr object #%d property: %s\n", Z_OBJ_HANDLE_P(object), Z_STRVAL_P(member));
 #endif                 
 
-       property_info = zend_get_property_info(zobj->ce, member, 0 TSRMLS_CC);
+       property_info = zend_get_property_info(zobj->ce, member, use_get TSRMLS_CC);
 
-       if (zend_hash_quick_find(zobj->properties, property_info->name, property_info->name_length+1, property_info->h, (void **) &retval) == FAILURE) {
+       if (!property_info || zend_hash_quick_find(zobj->properties, property_info->name, property_info->name_length+1, property_info->h, (void **) &retval) == FAILURE) {
                zval *new_zval;
 
-               if (!zobj->ce->__get && !zobj->ce->__set) {
+               if (!use_get) {
                        /* we don't have access controls - will just add it */
                        new_zval = &EG(uninitialized_zval);