我有11行代码将类中的各种类成员变量保存到临时变量中,然后再将它们用于其他内容,如下所示:
// Save parts of myclass
$dutyp1 = $this->myclass->p1;
$dutyp2 = $this->myclass->p2;
...
$dutySg = $this->myclass->sg;
一些覆盖类变量的代码发生在上面的块之后,然后我将变量恢复到类中,如下所示:
// restore parts of myclass
$this->myclass->p1 = $dutyp1;
$this->myclass->p2 = $dutyp2;
...
$this->myclass->sg = $dutySg;
我应该注意到类中还有其他变量,但只有上面的特定变量才是我想要保存/恢复的。
问题 - 是否有更紧凑的方法来执行此操作,而不是使用多个变量(如$dutyp1
,$dutyp2
等),或者是我有很多方法可以做到吗?我不是在寻找疯狂的压缩/编码,而是一种更紧凑的方式来做同样的事情而不必总共22行来保存/恢复。
答案 0 :(得分:2)
extract()
函数允许您将所有属性提取到变量。
// Without prefix
extract((array) $this->myclass);
// $p1, $p2, etc
// With prefix
extract((array) $this->myclass, EXTR_PREFIX_ALL, 'duty');
// $dutyp1, $dutyp2, etc
要恢复变量,您可以使用相反的compact()
。不幸的是,它无法处理您使用的前缀。
如果通过引用(&
)传递对象,则实际上将对原始对象应用修改。
$tmp = &$this->myclass;
$tmp->p1 = 123;
$this->myclass->p1; // 123
这样,您的对象始终是最新的,您无需还原。
答案 1 :(得分:0)
想出了这个:
//class member names
$keys = array('p1', 'p2', 'sg');
//save
$save = array();
foreach ($keys as $key) $save[$key] = $this->spec->{$key};
//restore
foreach ($keys as $key) $this->spec->{$key} = $save[$key];