ID:               37964
 Comment by:       ruslan dot kyrychuk at gmail dot com
 Reported By:      lavin dot peter at gmail dot com
 Status:           Assigned
 Bug Type:         Scripting Engine problem
 Operating System: Windows XP
 PHP Version:      5.1.4
 Assigned To:      tony2001
 New Comment:

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


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

[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.

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

[2006-08-20 09:31:05] ruslan dot kyrychuk at gmail dot com

I'd say it is not correct. Properties and methods defined as private
are inherited but you have no access to this properties in child
class.
If for example during serializing if you ommit private properties of
base class - you'll get wrong object.

class Base{
  private $basevar;
  public function baseFunction(){return $this->basevar;}
}
class Derived extends Base{}

if private properties are not inherited - than calling baseFunction
will cause null result and this is not correct in class inheritance.

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

[2006-07-04 14:13:08] lavin dot peter at gmail dot com

The "getMethods" method of ReflectionClass also returns the private
methods of the parent class.

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

[2006-06-29 20:06:15] lavin dot peter at gmail dot com

Description:
------------
When using the export method of ReflectionClass the private methods of
of a parent class are displayed.

Reproduce code:
---------------
class Base{
  private $basevar;
  private function baseFunction(){}
}
class Derived extends Base{}
$d = new Derived;
Reflection::export(new ReflectionClass($d));



Expected result:
----------------
Since properties and methods defined as private are not inherited, the
exported Base class should have no properties or methods but in fact
the private method of the Parent class shows up.

Actual result:
--------------
Class [ class Derived extends Base ] { @@ C:\Program Files\Apache
Group\Apache2\htdocs\newstuff\captcha\refbug.php 6-6 - Constants [0] {
} - Static properties [0] { } - Static methods [0] { } - Properties [0]
{ } - Methods [1] { Method [ private method baseFunction ] { @@
C:\Program Files\Apache
Group\Apache2\htdocs\newstuff\captcha\refbug.php 4 - 4 } } } 


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


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

Reply via email to