定义 php 函数时使用变量列表作为参数

Use list of variables as arguments when defining php function

提问人:Lori 提问时间:12/21/2018 最后编辑:Lori 更新时间:12/21/2018 访问量:499

问:

我尝试在定义函数时使用变量列表作为参数。看起来它应该是直截了当的,但不是。回调很容易,我可以使用 (...$listOfVariables) 将所有需要的参数放入回调中,但在定义函数时它不起作用。

我需要这个,因为我有 50 个不同的函数需要使用所有相同的参数。当参数列表发生变化时(确实如此),我需要一个中心位置来确保所有不同的函数都使用新的参数列表。(同样,我已经可以使用回调执行此操作,但在定义函数时就不行了)

以下是我通常为几个论点所做的方法。

$var1 = 'var1text';
$var2 = 'var2text';
$var3 = 'var3text';


function funcname($var1, $var2, $var3){

    echo $var1;
}

这很好用,但我的变量列表变化很大,并用于许多其他函数。我可能以错误的方式去做,我愿意接受你的任何建议。以下是我需要完成的工作。

编辑

1.在函数外部定义的变量

$var1 = 'var1text';
$var2 = 'var2text';
$var3 = 'var3text';

2.包含所有这些变量的变量

$listOfVar = $var1, $var2, $var3; //***see note below***.

3.包括我可以在函数中使用的变量列表,这样我就不必像在第一个代码片段中那样一次列出一个变量。

function funcname($listOfVar){

    echo $var1;
}

我正在尝试制作的完整代码:

$var1 = 'var1text';
$var2 = 'var2text';
$var3 = 'var3text';

$listOfVar = $var1, $var2, $var3;

function funcname($listOfVar){

    echo $var1;
}

**我意识到$listOfVar语法中的逗号对此不正确,但是语法是什么?我尝试过变量 ($$) - 尝试将字符串转换为变量名称引用。我试过数组。我已经尝试了数百种变体,但我对此毫无想法。请帮忙。

php 函数 参数 变量

评论

2赞 Nigel Ren 12/21/2018
如果参数列表如此不稳定 - 为什么不直接传入一个数组呢?
0赞 Lori 12/21/2018
我很想。我还没有成功地找到正确的方法。我所有的尝试都一无所获。你能告诉我如何使用我提供的代码来做到这一点吗?
0赞 Don't Panic 12/21/2018
你能解释一下,等最初是从哪里来的吗?也许有一种不同的方法可以解决这个问题。$var1$var2
0赞 Lori 12/21/2018
如上所述,它们来自函数外部。如果我使用我提交的第一段代码,它可以正常工作。因此,这不是范围问题。我只想将变量压缩到一个位置以便于更改。我需要一个变量来包含函数中使用的变量列表。请参阅我上面的编辑。

答:

0赞 Nigel Ren 12/21/2018 #1

相反,如果您使用数组来传递数据...

function funcname($vars){
    echo $vars[0];
}

虽然它有优点,不确定这是否是一个好主意,但你也可以使用关联数组......

function funcname($vars){
    echo $vars['var1'];
}
-1赞 Dave 12/21/2018 #2

只需将变量放入数组中,并将数组的名称传递给函数即可。

$vararray[] = 'var1text';
$vararray[] = 'var2text';
$vararray[] = 'var3text';
funcname($vararray);

function funcname($variable_array){
    echo $variable_array[1];  // will echo var2text
}

评论

0赞 Lori 12/21/2018
因此,我遇到的问题是,现在必须更改对函数中变量的所有调用以包含索引 [ ]。这是一项艰巨的工作。理想情况下,我想使用最初命名的变量名称,而不必包含索引。因此,数组可能不是答案。
1赞 Anwar 12/21/2018 #3

如果您事先不知道最终开发器将在函数上使用多少个变量,则可以使用 .它以数组形式返回每个变量值。func_get_args()

下面是一个用法示例:

function foo() {
  $arguments = func_get_args();

  return $arguments;
}

print_r(foo(1, 2, 3)); // [1, 2, 3]
print_r(foo('a', 'b', 'c')); // ['a', 'b', 'c']

我之所以使用这个函数,是因为你提到了一个事实,即你事先不知道最终开发器将放置多少个参数。

评论

0赞 Lori 12/21/2018
我确实知道有多少变量,只是我将从列表中添加和减去,我需要一个地方对列表进行集中更改......因此,一个包含所有变量的变量。
0赞 Anwar 12/21/2018
不确定您的问题,因为您没有提供足够的上下文。这是否 repl.it 很好地说明您的问题?
0赞 Jaquarh 12/21/2018 #4

将来,请阅读如何创建最小、完整和可验证的示例,以便我们了解您的问题,以便为您提供帮助。

方法有自己的作用域,这意味着除非另有声明或传递,否则该方法将无法访问变量。

class Retriever {
    private static $instance;
    protected $listOfVars = array();

    public static function getInstance() {
        if(self::$instance) return self::$instance;
        self::$instance = new self();
        return self::$instance;
    }

    private function __construct() {}

    public function addVar($var) { array_push($this->listOfVars, $var); return $this; }
    public function getVars() { return $this->listOfVars; }
    public function reset() { $this->listOfVars = array(); return $this; }
}

function name($var1, $var2, $var3) {
    echo $var1;
}
function anotherName($var1, $var2) {
    echo $var2;
}

Retriever::getInstance()->addVar("var1text")->addVar("var2text")->addVar("var3text");
name(...Retriever::getInstance()->getVars()); # Output: var1test

Retriever::getInstance()->reset()->addVar("var1text")->addVar("var2text");
anotherName(...Retriever::getInstance()->getVars()); # Output: var2text

现场演示

或者你可以使用 list() 方法

function name($listOfVars) { 
    list($var1, $var2) = $listOfVars;
    echo $var1;
}

name(array(‘var1text’, ‘var2text’));

评论

0赞 Lori 12/21/2018
谢谢。。。我已经在为回调这样做了。定义就是痛苦。我不想一遍又一遍地更改定义中的参数。这就是我需要阵列的地方。
0赞 Jaquarh 12/21/2018
根据定义,您是指数组键吗?如果数组不是 assoc 数组,则不能使用 splat 运算符。也许传入一个对象?我更新我的答案
0赞 Lori 12/21/2018
我的意思是,当我定义(命名)函数并包含参数时,我需要它看起来像上面的第二个示例代码。这正是我所需要的。我宁愿不使用键、索引或其他任何我必须编辑函数中的变量名称的东西。只是一个包含$variables的$variable......即 - $allVar = $var 1, $var 2, $var 3。看起来很简单。与其说是:(,不如说是
0赞 Jaquarh 12/21/2018
在这种情况下,我对您的预期输出感到困惑,您想将变量列表传递到方法中并对它们做什么?您可以使用 join() 将变量相互连接,即: function name($arg) ...name(join(' ', [$arg 1, $arg 2...
0赞 Lori 12/21/2018
我已经在上面的代码中准确地说明了我需要什么。我不知道如何更好地解释它。我需要一个变量,其中包含我将要传递到函数中的所有变量名称。
0赞 Don't Panic 12/21/2018 #5

也许你可以修改你的函数,让它接受一个数组而不是多个参数。

function funcname(array $args){
    foreach ($args as $arg_name => $arg) {
        // do stuff with $arg_name and $arg
    }
    // or refer to a specific argument, like where you would have said $var1, instead...
    $args['var1'];
    // or extract the array within your function to get the keys as variables
    extract($args);
    echo $var1;
    // If you do this, be sure to heed the warnings about extract.
    // Particularly the bit about not extracting $_GET, $_POST, etc.
}

然后,与其定义单独的变量,例如

$var1 = 'var1text';
$var2 = 'var2text';
$var3 = 'var3text';

创建关联数组

$text['var1'] = 'var1text';
$text['var2'] = 'var2text';
$text['var3'] = 'var3text';

如果您有多个函数需要使用相同的不同参数列表,我认为将它们收集在一个类中是有意义的。然后,您可以将参数的关联数组传递给类构造函数,以便所有方法都可以访问同一组变量。

class SomeFunctions
{

    private $listOfVar = [];

    public function __construct(array $listOfVar) {
        $this->listOfVar = $listOfVar;
    }

    public function funcnameA() {
        foreach ($this->listOfVar as $name => $value) // ...
    }

    public function funcnameB() {
        $this->listOfVar['var1'];
    }
}

$example = new SomeFunctions(['var1' => 'something', 'var2' => 'something']);
$example->funcnameA();
$example->funcnameB();

如果需要将这些函数用作回调,可以像这样将它们作为回调参数传递:

functionThatTakesaCallback([$example, 'funcnameB']);

也许这可能是更改变量列表的中心位置?

评论

0赞 Lori 12/21/2018
这是一个解决方案,但我试图避免改变我在函数中调用变量的方式。使用我的第一个解决方案(上面有效的解决方案),我可以将$variable传递到函数中,并按照已经命名的方式使用它。对于这个数组,我必须更改函数中的所有引用,以使用索引引用它......或者我可能是错的?
0赞 Don't Panic 12/21/2018
不,没有错。如果你传递一个数组,你需要通过索引来引用其中的元素,除非你在函数内部使用。但我想我不明白你如何在不知道哪些变量会传递给它的情况下引用函数中的不同变量。extract
0赞 Lori 12/21/2018
我确实知道将传递哪些变量。最重要的是,我需要一个中心位置来在需要时更改列表,而无需转到每个单独的函数来更改我传递的变量。就是这样。我知道这很令人困惑,这就是我扯掉头发的原因。
0赞 Don't Panic 12/21/2018
哦,所以问题不在于一个函数,而在于你有多个函数需要采用相同的不同参数列表?
0赞 Lori 12/21/2018
我的天啊,是的。没错!我想我没有很好地解释这部分。