我可以以更紧凑的方式重写多个变量赋值吗?
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];
【讨论】:
以上是关于我可以以更紧凑的方式重写多个变量赋值吗?的主要内容,如果未能解决你的问题,请参考以下文章