ID:               37964
 Updated by:       [EMAIL PROTECTED]
 Reported By:      lavin dot peter at gmail dot com
-Status:           Assigned
+Status:           Closed
 Bug Type:         Scripting Engine problem
 Operating System: Windows XP
-PHP Version:      5.1.4
+PHP Version:      5.2.*
 Assigned To:      helly
 New Comment:

This bug has been fixed in CVS.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.




Previous Comments:
------------------------------------------------------------------------

[2008-01-16 10:34:47] [EMAIL PROTECTED]

Assigned to the Reflection maintainer.

------------------------------------------------------------------------

[2008-01-16 02:18:02] [EMAIL PROTECTED]

Simple fix:

Index: php_reflection.c
===================================================================
RCS file: /repository/php-src/ext/reflection/php_reflection.c,v
retrieving revision 1.164.2.33.2.45.2.6
diff -u -r1.164.2.33.2.45.2.6 php_reflection.c
--- php_reflection.c    31 Dec 2007 07:17:13 -0000     
1.164.2.33.2.45.2.6
+++ php_reflection.c    16 Jan 2008 02:14:41 -0000
@@ -519,7 +519,8 @@
                       
zend_hash_internal_pointer_reset_ex(&ce->function_table, &pos);
 
                        while
(zend_hash_get_current_data_ex(&ce->function_table, (void **) &mptr,
&pos) == SUCCESS) {
-                               if (!(mptr->common.fn_flags &
ZEND_ACC_STATIC)) {
+                               if (!((mptr->common.fn_flags &
ZEND_ACC_STATIC) || 
+                                       ((mptr->common.fn_flags &
ZEND_ACC_PRIVATE) && mptr->common.scope != ce))) {
                                        char *key;
                                        uint key_len;
                                        ulong num_index;


------------------------------------------------------------------------

[2006-08-20 13:36:43] ruslan dot kyrychuk at gmail dot com

Maybe it is not valid to have private variables of parent class in
Reflection. Then it is only my own custom serialization problem.

------------------------------------------------------------------------

[2006-08-20 12:39:18] ruslan dot kyrychuk at gmail dot com

With this serializing interface (if you mean __sleep and __wakeup
method) and with reflection can not work with private variables, I can
not write serialization method that can be used in all child classes .In
every child class Reflection will have child instance and will not have
access for private variables of parent. 

Reproduce code:
---------------
class A
{
        public function __sleep() 
        {
                $refl = new ReflectionObject($this);
                $props = $refl->getProperties();
                $result = array();
                foreach($props as $prop)
                        $result[] = $prop->getName();
                return $result ;
        }
        private $privateVar = 'Test Private';
        public $publicVar = 'Test Public';
        
        public function setPublic($value)
        {
                $this->publicVar = $value;
        }
        public function setPrivate($value)
        {
                $this->privateVar = $value;
        }
}

class B extends A{}

$instance = new B();
$instance->setPrivate('Set Test Private');
$instance->setPublic('Set Test Private');

var_dump($instance);
var_dump(unserialize(serialize($instance)));

Expected result:
----------------
Object before serializing and after is same.

Actual result:
--------------
object(B)#1 (2) {
  ["privateVar:private"]=>
  string(16) "Set Test Private"
  ["publicVar"]=>
  string(16) "Set Test Private"
}
object(B)#3 (2) {
  ["privateVar:private"]=>
  string(12) "Test Private"
  ["publicVar"]=>
  string(16) "Set Test Private"
}


--------------
When writing 
public function __sleep(){return array('privateVar', 'publicVar');} In
B class
Than you'll get 

Notice: serialize() [function.serialize]: "privateVar" returned as
member variable from __sleep() but does not exist.

So you can't write custom serializing for child object when private
properties exists in parent class.

------------------------------------------------------------------------

[2006-08-20 11:07:59] [EMAIL PROTECTED]

That is why we have a new serializing interface which allows you to
call a serializing function in the base class which then can deal with
the private properties in that base class.

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/37964

-- 
Edit this bug report at http://bugs.php.net/?id=37964&edit=1

Reply via email to