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

Posted

技术标签:

【中文标题】我可以以更紧凑的方式重写多个变量赋值吗?【英文标题】:Can I rewrite multiple variable assignment in a more compact way? 【发布时间】:2015-06-16 08:36:16 【问题描述】:

我有 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】:

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

这样,您的对象始终是最新的,您无需恢复。

【讨论】:

嗯,这很酷,不知道可以做到,谢谢! @Dennis 稍微修改了我的答案,以防有人(有相同问题)遇到这个问题:)【参考方案2】:

想出了这个:

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

【讨论】:

以上是关于我可以以更紧凑的方式重写多个变量赋值吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++中为何不能对共用体变量名赋值?

在C语言中.结构体变量之间可以相互赋值吗

php中smarty怎么赋值变量到模板

在C语言中。结构体变量之间可以相互赋值吗?

数组变量可以作赋值操作吗?

一次为多个变量分配相同的值?