我需要以相同的方式修改一些变量。例如,当满足某些条件时,我需要将每个变量乘以2。像这样:
$a = 10;
$b = 100;
$c = 1000;
$d = 10000;
if($someCondition) {
$a *= 2;
$b *= 2;
$c *= 2;
$d *= 2;
}
这里我想调用一个函数将更改应用于所有变量,而不是逐个相乘。我尝试使用像这样的 的回调函数(为这种类型的简单计算编写这样的函数可能看起来很傻,但我有更复杂的事情要做,只是为了更好地理解这里保持简单) :
function multiply_vars(&$a,&$b,&$c,&$d) {
foreach(func_get_args() as $val) {
$val *= 2;
}
}
if($someCondition) {
multiply_vars($a,$b,$c,$d);
}
这很有效,但我需要确切地知道我传递给函数的变量数量,并将每个变量设置为
&
的引用。例如,当我传递5个变量进行修改时,上面的函数会给我错误的结果。
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()
函数可以更好地解决它,如果它在一个数组中。
答案 0 :(得分:3)
您需要可变参数列表
这是通过引用将可变数量的参数传递给函数的示例:
PHP: variable-length argument list by reference?
从以上链接复制并粘贴:
示例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
答案 1 :(得分:1)
我意识到你说你不想把变量放在一个数组中。但是,您可能会传递一组引用以避免附加值复制。 E.g。
<?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的更新答案是更好的解决方案。
答案 2 :(得分:0)
我只是将它们作为数组传递。例如:
$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
}
答案 3 :(得分:0)
您的需求告诉您的策略不正确。即使它有效,您的代码可读性和可维护性也不会很好! 无论如何,我建议您创建一个函数而不是您的过程,您可以在需要时调用它并用输出替换原始变量。
一个例子:
Function doStuff ($input){
treat_input;
Return output;
}
$x = doStuff ($×);
....
嗯,我知道您需要多次调用此函数作为变量的数量。但请相信我,这是你必须根据长期维护脚本的经验而去的方式。
答案 4 :(得分:0)
在这里扩展其他答案,为什么不使用一个对象?我假设您的问题是一个简单的情况,但有一些好处:对象总是通过引用传递,分配给对象属性的值本身可以通过引用访问。
例如:
$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);
}