メソッド間で共有するために必要な多くのデータを含むpublic 配列を保持するクラスが$saved
あります (以下の例)...
class Common {
public $saved = array();
public function setUser($data) {
$this->saved['user_data'] = $data;
}
public function getUserID() {
return $this->saved['user_data']['id'];
}
}
このように機能するコードは、文字通り何千行もあるのです。
問題は、拡張するクラスの新しいインスタンスがCommon
いくつかのメソッド内で作成されているため、それらがアクセスしたときに$saved
同じデータが保持されないことです。
解決策は$saved
静的変数を作成することですが、すべての参照を変更することはできない$this->saved
ため、コードを同一に保ちながら静的に動作させたいと考えています。
$this->saved
これが呼び出しを静的にする私の試みです...
class PropertyTest {
private $data = array();
public function __set($name, $value) {
$this->data[$name] = $value;
}
public function __get($name) {
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
return null;
}
public function __isset($name) {
return isset($this->data[$name]);
}
public function __unset($name) {
unset($this->data[$name]);
}
}
class Common {
public $saved;
private static $_instance;
public function __construct() {
$this->saved = self::getInstance();
}
public static function getInstance() {
if (self::$_instance === null) {
self::$_instance = new PropertyTest();
self::$_instance->foo = array();
}
return self::$_instance->foo;
}
}
静的にとどまらないように見える変数を設定すると、これはうまく機能しません(以下のテストケース)...
class Template extends Common {
public function __construct() {
parent::__construct();
$this->saved['user_data'] = array('name' => 'bob');
$user = new User();
}
}
class User extends Common {
public function __construct() {
parent::__construct();
$this->saved['user_data']['name'] .= " rocks!";
$this->saved['user_data']['id'] = array(400, 10, 20);
}
}
$tpl = new Template();
print_r($tpl->saved['user_data']);
$this->saved
は初期化されたときに空User
であり、同じ変数ではないようです。最終的print_r
には name => bob の配列のみが表示されます。
何か案は?