我可以用更紧凑的方式重写多变量赋值吗


Can I rewrite multiple variable assignment in a more compact way?

我有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行。

1:提取(带前缀)变量的属性

extract()函数允许您提取变量的所有属性。

// Without prefix
extract((array) $this->myclass);
// $p1, $p2, etc
// With prefix
extract((array) $this->myclass, EXTR_PREFIX_ALL, 'duty');
// $dutyp1, $dutyp2, etc

要恢复变量,可以使用它的相反方compact()。不幸的是,它无法处理您使用的前缀。


2:通过引用传递的对象

如果通过引用传递对象(&),则修改将实际应用于原始对象。

$tmp = &$this->myclass;
$tmp->p1 = 123;
$this->myclass->p1; // 123

通过这种方式,您的对象始终是最新的,并且您不必进行恢复。

想出了这个:

//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];