我们有一个类,它包含一个名为的公共数组$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
仅显示名称 => bob 的数组。
有任何想法吗?