problems with overloading in php 5.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I have an interesting problem that I cannot explain with using the
__set() and __get() when playing with arrays.

Basically with a normal object if you store an array as a property you
can manipulate it like an array. eg.

$obj->prop[5] = 'apple';

In this example if $obj->prop is an array then the position 5 will then
contain 'apple'. This is expected behaviour and works very well.

Now if you use the following code and use overloading you can do the
same thing.

--8<--
<?php

class ex {
  public function __get($prop) {
    echo "getting property $prop\n";
    return $this->fields[$prop];
  }

  public function __set($prop, $value) {
    echo "setting property $prop\n";
    $this->fields[$prop] = $value;
  }

  private $fields;
}

$obj = new ex;
$obj->prop = array(4 => 'pear');

$obj->prop[5] = 'apple';
?>
--8<--

as expected it will work exactly the same as the first example. but the
output "setting property prop" is not shown when the $obj->prop[5] which
I find a little strange.

but now if I do not store the values in the object as an array but store
them as something else like a serialized string it will not work. eg.

--8<--
<?php

class ex {
  public function __get($prop) {
    echo "getting property $prop\n";
    return unserialize($this->fields[$prop]);
  }

  public function __set($prop, $value) {
    echo "setting property $prop\n";
    $this->fields[$prop] = serialize($value);
  }

  private $fields;
}

$obj = new ex;
$obj->prop = array(4 => 'pear');

$obj->prop[5] = 'apple';
?>
--8<--

Now this example will not work. Could someone please help me understand
why. I have a funny feeling that the __set() is not being called, and
something in the php5 overload code is guessing what should happen and
doing it.

I am not on the php-general mail list so any replies can you please send
it directly to me.

Thanks to anyone that can solve this for me.
Gordon.

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux