日記
配列が絡んだ__setの挙動Edit

class Foo
{
protected $_array = array();
public function __get($name)
{
echo "__get called by $name\n";
switch ($name) {
case 'array': return $this->_array;
default:
throw new Exception();
}
}
public function __set($name, $value)
{
echo "__set called by $name, $value\n";
switch ($name) {
case 'array':
$this->_array = $value;
break;
default:
throw new Exception();
}
}
}
$foo = new Foo();
var_dump($foo->array);
$foo->array = array(1);
var_dump($foo->array);
$foo->array[] = 2;
var_dump($foo->array);

が、

__get called by array
array(0) {
}
__set called by array, Array
__get called by array
array(1) {
[0]=>
int(1)
}
__get called by array
__get called by array
array(2) {
[0]=>
int(1)
[1]=>
int(2)
}

ってなる(PHP 5.1.4/Windows XP Professional)のは正しいのか?

$foo->array[] = 2;

のところで__setが呼ばれずに、直接Foo::$_arrayに追加されているんだけど。

っつーか、

$foo->array[] = 2;

$tmp = $foo->array;
array_push($tmp, 2);
$foo->array = $tmp;

相当の処理だと信じていたんだけど。

Published At2006-06-06 00:00Updated At2006-06-06 00:00