こんなことできるんですね

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でオブジェクトを直接参照できない(一度変数に入れる必要がある)

やっぱあまり使えないかも・・・