こんなことできるんですね
4.3.0以降限定だし、あまり推奨されていないけど、こんなことできるんですね。
できるんだったらActionクラスが楽になりそうだなぁと思っただけです。
ものすごーく分かりづらくなるけど、プロパティに設定いらなくなるしなぁ・・・
<?php class Oya { var $_props = array(); function __get($name, $value) { $value = $this->_props[$name]; return true; } function __set($name, &$value) { $this->_props[$name] =& $value; return true; } } class Ko extends Oya { } overload('Ko'); class Test { var $_s; function Test($s) { $this->_s = $s; } function output() { print $this->_s . "\n"; } } $k = new Ko(); // 追加&変更 $k->key1 = "文字"; // 文字列 $k->key2 = 1; // 数値 $k->key3 = array(1, 2, 3); // 配列 // オブジェクトの追加(「&」をつけなくても参照渡し) $obj = new Test("テスト"); $k->key4 = $obj; var_dump($k); // 取り出し print $k->key1."\n"; print $k->key2."\n"; print $k->key3[1]."\n"; $o = $k->key4; // 直接は参照できないみたいなので変数にいれる。 $o->output(); //print $k->key5 ."\n"; // そんなプロパティないよとのエラーが出る // 参照のテスト $obj->_s = "変えた!"; var_dump($k->key4); $o = $k->key4; $o->output(); ?>
こんな出力になります。
object(ko)(1) { ["_props"]=> array(4) { ["key1"]=> &string(4) "文字" ["key2"]=> &int(1) ["key3"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["key4"]=> &object(test)(1) { ["_s"]=> string(6) "テスト" } } } 文字 1 2 object(test)(1) { ["_s"]=> string(6) "テスト" } テスト object(test)(1) { ["_s"]=> string(8) "変えた!" } 変えた!
若干勘違いしてた。
- overloadは実際に使用するクラス(サブクラス)を指定しなきゃだめみたい
- プロパティのsetとgetに「&」が必要ない。というか指定するとエラーになる。(参照渡し自体はされているようだ)
- getでオブジェクトを直接参照できない(一度変数に入れる必要がある)
やっぱあまり使えないかも・・・