Edit report at http://bugs.php.net/bug.php?id=52706&edit=1
ID: 52706
Comment by: dev dot php at linke-t dot net
Reported by: dev dot php at linke-t dot net
Summary:__sleep inhertiance
Status: Bogus
Type: Bug
Package:Scripting Engine problem
Operating System: Win7
PHP Version:5.3.3
Block user comment: N
New Comment:
I think the primary problems i have are not tested.
I wrote a class with a private property.
class foo{
private $v;
function foo(){
$this->v="bar";
}
}
And a class wich extends it:
class foo2 extends foo{
function foo2(){
$this->foo();
}
function __sleep(){
return array("v");
}
}
with __sleep serialize will Output: O:10:"foo2":1:{s:1:"v";N;}
without __sleep is the output like:
O:10:"foo2":1:{s:6:"foov";s:3:"bar";}
so serialize without __sleep allow acces to private properties. I think,
if foo2 doesnt have access to a private property of class foo, than
serialize didnt had it too.
But if i want to save an object ... so i need to save it completly ...
so it have to save the private propertys as well. In C++ for as an
example i will copy the memory ... so i have copied the private
properties as all others.
and if this isnt a bug ... it's an bad feature ... I think we need to
call it "The dont use __sleep()" feature ;)
I hope i wont get another "its not a bug" - correct the behaivor or
wrote in the documention how to save an object with private property of
super class, thanks.
"Yes, class design has to be well thought."
Yes, I aggree - and i think the behavior of functions should it be too.
Previous Comments:
[2010-08-26 15:55:50] johan...@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php
Yes, class design has to be well thought.
------------
[2010-08-26 12:14:10] dev dot php at linke-t dot net
Description:
i the case of class "B" extends a class "A" wich define the function
__sleep(), instances of class "B" would class A::__sleep. In this case
class serialzing would be very buggy - i tried something like:
Try: let return the __sleep of class "A" all propertys wich are
currently definied
resoulting Problem: private properety of class "B" are null or NAN
Try: define the function __sleep() in class "B"
resoulting Problem: private properety of class "A" are null or NAN
Test script:
---
class A{
public $A_A = 10;
protected $A_B = 11;
private $A_C = 12;
public function A(){
}
private function __sleep(){
echo "sleep of A()";
if(get_class($this) != "A")
{
$d = array_keys( get_class_vars(get_class($this)));
return ($d);
}
return array("A_A","A_B","A_C");
}
public function __get($v){
return "PR";
}
}
class B extends A{
public $B_A = 20;
protected $B_B = 21;
private $B_C = 22;
public function B(){
$this->A();
}
public function __sleep(){
return array("A_A","A_B","A_C","B_A","B_B","B_C");
} /* remove this __sleep would let php use A::__sleep()
}
$a = new A();
$b = new B();
echo "A";
echo "" . htmlspecialchars(serialize($a));
echo "B";
echo "" . htmlspecialchars(serialize($b));
Expected result:
the complettely serialized Object like with out __sleep()!
Actual result:
--
private propertys of parent or child are null or NAN with defined
__sleep()
--
Edit this bug report at http://bugs.php.net/bug.php?id=52706&edit=1