我需要用同样的方式修改一些变量。例如,当满足某些条件时,我需要将每个变量乘以2。像这样:
$a = 10;
$b = 100;
$c = 1000;
$d = 10000;
if($someCondition) {
$a *= 2;
$b *= 2;
$c *= 2;
$d *= 2;
}
在这里,我想调用一个函数,将更改应用于所有变量,而不是一乘一。我试着使用这样的回调函数(为这种类型的简单计算编写这样的函数可能看起来很傻,但我还有更复杂的事情要做,只是在这里保持简单以更好地理解):
试验1
function multiply_vars(&$a,&$b,&$c,&$d) {
foreach(func_get_args() as $val) {
$val *= 2;
}
}
if($someCondition) {
multiply_vars($a,$b,$c,$d);
}
这是可行的,但我需要确切地知道我传递给函数的变量数量,并将每个变量设置为
&
的引用。例如,当我传递5个变量进行修改时,上面的函数会给我不正确的结果。
试验2
function multiply_vars() {
foreach(func_get_args() as $varname) {
global $$varname;
$$varname *= 2;
}
}
if($someCondition) {
modify_vars('a','b','c','d');
}
这在全球范围内有效。但问题是,我在类函数中这样做,其中
global $$varname
引用了类函数之外的变量。
还有其他方法可以达到我的目的吗
注意:我不想将变量放入数组中。我知道,如果它在一个数组中,
array_map()
函数可以更好地解决它
您想要一个可变参数列表
以下是通过引用将可变数量的参数传递给函数的示例:
PHP:引用可变长度参数列表?
从上面的链接复制和粘贴:
示例1:
function foo(&...$args) {
$args[0] = 'bar';
}
foo($a);
echo $a, "'n";
# output:
#a
示例2:
function number(&...$args) {
foreach ($args as $k => &$v) {
$v = $k;
}
}
number($zero, $one, $two);
echo "$zero, $one, $two'n";
# output:
#0, 1, 2
我知道你说过不想把变量放在数组中。但是,您可能会传递一个引用数组,以避免额外的值复制。例如
<?php
$a = 10;
$b = 100;
$c = 1000;
$d = 10000;
function multiply_vars($args) {
foreach($args as &$arg) $arg *= 2;
}
multiply_vars([&$a, &$b, &$c, &$d]);
然而,如果您使用的是PHP 5.6,我认为Magical Gordon的更新答案是一个更好的解决方案。
我只是将它们作为数组传入。例如:
$variables = array(
'a' => 10,
'b' => 100,
'c' => 100,
'd' => 1000,
);
function multiply_vars($variables) {
$returnValues = array();
foreach($variables as $key => $value) {
$newValue = $value * 2;
array_push($returnValues, array($key => $newValue));
}
return $returnValues;
}
if($someCondition) {
$variablesWithNewValues = multiply_vars($variables);
//do stuff with $variablesWithNewValues
}
您的需求告诉您的策略不正确。即使它有效,你的代码可读性和可维护性也不会很好!无论如何,我建议您创建一个函数,而不是过程,您可以在需要时调用它,并用输出替换原始变量。
示例:
Function doStuff ($input){
treat_input;
Return output;
}
$x = doStuff ($×);
....
好吧,我知道你需要调用这个函数的次数和变量的数量一样多。但相信我,根据长期维护脚本的经验,这是你必须走的路。
在这里扩展其他答案,为什么不使用对象?我假设你的问题是一个简单的例子,但有一些好处:对象总是通过引用传递的,分配给对象属性的值本身也可以通过引用访问。
例如:
$numbers = new 'StdClass();
$numbers->a = 10;
$numbers->b = 100;
$numbers->c = 100;
$numbers->d = 100;
然后在全局范围中使用$numbers->a
而不是$a
,或者通过引用$a = &$numbers->a;
使用另一个变量
function multiply(StdClass $numbers, $multiple = 2)
{
// Iteration isn't directly achievable with StdClass but...
foreach (get_object_vars($numbers) as $key => $value) {
$numbers->$key *= $multiple;
}
}
最后,我们的条件:
if (true === myCondition) {
multiply($numbers);
}