#38640 [Asn->Csd]: Fatal error while get unsetted property.
| From: | tony2001@php.net | Date: | Wed, 29 Nov 2006 22:12:27 +0000 |
| Subject: | #38640 [Asn->Csd]: Fatal error while get unsetted property. | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-105675@lists.php.net to get a copy of this message | ||
ID: 38640
Updated by: tony2001@php.net
Reported By: ruslan dot kyrychuk at gmail dot com
-Status: Assigned
+Status: Closed
Bug Type: Scripting Engine problem
Operating System: Windows 2003, XP
PHP Version: 5.1.5
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.
Looks like I committed the patch and forgot to close report.
Anyway, it works fine now.
Previous Comments:
------------------------------------------------------------------------
[2006-08-29 11:08:23] tony2001@php.net
Assigned to the maintainer.
Marcus, please take a look at this patch:
http://tony2001.phpclub.net/dev/tmp/bug38640.diff
I don't want to commit it when you're still on vacation, since I don't
understand what was the original idea behind getValue/setValue - it
seems quite obvious that they must use getter/setter, but for some
reason they don't.
The patch changes both of them to use appropriate engine calls.
------------------------------------------------------------------------
[2006-08-29 10:02:11] ruslan dot kyrychuk at gmail dot com
Description:
------------
When unsetting object property it unsetted from object then __get
method of object is called while accessing it.
Besides property exists in all reflection objects (ReflectionObject and
ReflectionProperty) but cause Fatal error while getting it.
Reproduce code:
---------------
<?php
class B{}
class A
{
public $Var = null;
public function __construct()
{
$this->Var= new B();
}
public function __get($name)
{
echo "get {$name}\n";
if(isset($this->Var))
{
return $this->Var;
}
else
{
echo "Undefined variable\n";
return null;
}
}
public function __unset($nm)
{
echo "unset";
}
}
$a = new A();
unset($a->Var);
$o = new ReflectionObject($a);
$p = $o->getProperty('Var');
Reflection::export($o);//Variable Exists
Reflection::export($p);//Variable Exists
var_dump($a->Var);//__get called
var_dump($p->getValue($a)); //Fatal error
?>
Expected result:
----------------
$o = new ReflectionObject($a);
has correct current instance properties or
$p->getValue($a) - will call __get method too and not cause fatal
error.
Actual result:
--------------
Object of class [ <user> class A ] {
@@ D:\WWW\www.usoftinc.com\test2.php 3-27
- Constants [0] {
}
- Static properties [0] {
}
- Static methods [0] {
}
- Properties [1] {
Property [ <default> public $Var ]
}
- Dynamic properties [0] {
}
- Methods [3] {
Method [ <user, ctor> public method __construct ] {
@@ D:\WWW\www.usoftinc.com\test2.php 6 - 9
}
Method [ <user> public method __get ] {
@@ D:\WWW\www.usoftinc.com\test2.php 10 - 22
- Parameters [1] {
Parameter #0 [ <required> $name ]
}
}
Method [ <user> public method __unset ] {
@@ D:\WWW\www.usoftinc.com\test2.php 23 - 26
- Parameters [1] {
Parameter #0 [ <required> $nm ]
}
}
}
}
Property [ <default> public $Var ]
get Var
Undefined variable
NULL
<br />
<b>Fatal error</b>: Internal error: Could not find the property Var in
<b>test2.php</b> on line <b>36</b><br />
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=38640&edit=1