用PHP中的单个函数修改多个变量


Modify multiple variables with single function in PHP

我需要用同样的方式修改一些变量。例如,当满足某些条件时,我需要将每个变量乘以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);
}