Mombu the Php Forum sponsored links

Go Back   Mombu the Php Forum > Php > #28444 : "Cannot access undefined property for object with overloaded property access"
User Name
Password
REGISTER NOW! Mark Forums Read

sponsored links


Reply
 
1 4th March 00:35
php-bugs
External User
 
Posts: 1
Default #28444 : "Cannot access undefined property for object with overloaded property access"


ID: 28444
Comment by: keithm at aoeex dot com
Reported By: dennis at inmarket dot lviv dot ua
Status: Assigned
Bug Type: Class/Object related
Operating System: WinXP
PHP Version: 5.0.0RC2
Assigned To: andi
New Comment:

I ran into this problem also, but slighly differently. In my case, the
first property I'm accessing is a validly declared and set property of
the class, instead of set using __set or read using __get. I've tried
to reproduce it using simpler code, but I can't seem to get it done.
The actual code I'm using is far too complex for a bug report
submission (it's a customized DOM implemtation)

I'll see if I can describe it at all. Basically I have the following
classes that are involved:
abstract class Node -- Does define __set/__get
abstract class HTMLElement extends Node -- Does define __set/__get
class HTMLInputElement extends HTMLElement -- Does define __set/__get
class FormElement extends HTMLElement -- Does NOT define __set/__get

Now, the FormElement class has variable declarations like so:
private $minput;
private $mlabel;
private $mlplacement;
private $container;

$minput is eventuall an instance of HTMLInputElement when this error
occurs. Here is the relevent part of the formElement->setInputType
function

public function setInputType($xtype){
unset($this->minput);
switch ($xtype){
.......
case 'radio': case 'text': case 'entry': case
'button': case 'image': case 'submit': case 'reset': case 'checkbox':

$this->minput=$this->ownerDo***ent->createElement('INPUT');
/* as of this point, $this->minput is a valid HTMLInputElement
instance, verified w/ print_r */
$this->minput->type = $xtype;
break;
....
}


When that method is called, I receive the error in question on the
line: $this->minput->type = $xtype;

I'll keep trying to come up with simpler code that reproduces the bug,
but if anyone does want to view the big code (maybe for clarity) it is
available at
http://wiser.kicks-ass.org:8008/PHPDOM/PHPDOM-error.tar.gz


My PHP version is 5.0.2, and I can reproduce with both the CLI and
Apache 2 Module. Operating systems Both FreeBSD and Linux 2.6.9


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

[2004-11-08 20:05:09] php at rodric dot org

I ran into this in a slightly different way -- trying to
foreach through an ArrayAccess object. Interestingly,
removing the __set from class O allows this to work.


class O
{
private $m_a = array();

function __get ($key)
{
return $this->m_a[$key];
}
function __set ($key, $val)
{
$this->m_a[$key] = $val;
}
}

class A implements ArrayAccess, IteratorAggregate
{
private $m_e = array();

function __construct ($e = NULL)
{
$this->m_e = is_null ($e) ? array() : $e;
}

function offsetSet ($key, $value)
{
$this->m_e[$key] = $value;
}

function offsetGet ($key)
{
if (isset ($this->m_e[$key]))
{
return $this->m_e[$key];
}
}

function offsetUnset ($key)
{
unset ($this->m_e[$key]);
}

function offsetExists ($key)
{
return isset ($this->m_e[$key]);
}

function getIterator ()
{
return new ArrayIterator($this->m_e);
}
}

$o = new O();

$o->a = new A(array(1, 2, 3));

foreach ($o->a as $e)
{
echo "$e ";
}

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

[2004-10-13 14:05:03] info at pandora-web dot de

Another Test Case:
---------------
class TestClass {
private $_p = array();

public function __get($propName){
return $this->_p[$propName];
}

public function __set($propName, $propValue){
$this->_p[$propName] = $value;
}
}

$a = new TestClass();
$a->testVar = 'test';
print $a->testVar; //--> 'test'

$a->testVar = new TestClass();
$a->testVar->testVar = 'test2';
// __set of $a->testVar called instead
of getter of $a->testVar and setter of $a->testVar->testVar

Solution Hint:
----------------

I think I is better to call the __get method of the first objects and
than call the __set method of the last one in chain. Like you with
__call.

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

[2004-08-21 03:21:10] matth at alsync dot com

Another work around for this is:

a->b->__set('c', 'value');

At least the underlying calsses do not need to be changed to make this
work.

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

[2004-08-05 11:19:49] dennis at inmarket dot lviv dot ua

To derick@php.net: Please don't feel hurt by this comment. I think you
guys did a great job on making PHP5 what it is, but this bug is
different. I think (but I mon sure, since I don't get anything in the
PHP engine code) this should fix very well.

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

[2004-08-05 11:04:45] derick@php.net

There are plenty of other non fixed bugs. If we were to release when
the bug count reaches zero we would never release.

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

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/28444

--
Edit this bug report at http://bugs.php.net/?id=28444&edit=1
  Reply With Quote


  sponsored links


Reply


Thread Tools
Display Modes




Copyright 2006 SmartyDevil.com - Dies Mies Jeschet Boenedoesef Douvema Enitemaus -
666