定义php函数时使用变量列表作为参数
我试图在定义函数时使用变量列表作为参数。看起来应该是直截了当的,但不是。回调很简单,我可以使用(…$listOfVariables)将所有需要的参数都放到回调中,但在定义函数时它不起作用定义php函数时使用变量列表作为参数,php,function,arguments,variable-variables,Php,Function,Arguments,Variable Variables,我试图在定义函数时使用变量列表作为参数。看起来应该是直截了当的,但不是。回调很简单,我可以使用(…$listOfVariables)将所有需要的参数都放到回调中,但在定义函数时它不起作用 $vararray[] = 'var1text'; $vararray[] = 'var2text'; $vararray[] = 'var3text'; funcname($vararray); function funcname($variable_array){ echo $variable_a
$vararray[] = 'var1text';
$vararray[] = 'var2text';
$vararray[] = 'var3text';
funcname($vararray);
function funcname($variable_array){
echo $variable_array[1]; // will echo var2text
}
我需要这个,因为我有50个不同的函数,需要使用所有相同的参数。当参数列表发生变化时(确实如此),我需要一个中心位置来确保所有不同的函数都使用新的参数列表。(同样,我已经可以通过回调实现这一点,但在定义函数时却不行)
以下是我通常在一些争论中的做法
$var1 = 'var1text';
$var2 = 'var2text';
$var3 = 'var3text';
function funcname($var1, $var2, $var3){
echo $var1;
}
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.
}
这很好,但是我的变量列表变化很大,并且在许多其他函数中使用。我可能走错了方向,我愿意接受你的任何建议。下面是我需要完成的
已编辑
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语法中的逗号对此不正确,但是语法是什么呢?我尝试了变量($$)-尝试将字符串转换为变量名引用。我试过数组。我已经尝试了数百种不同的方法,我只是没有办法做到这一点。请帮忙 如果您使用数组作为传递的数据
function funcname($vars){
echo $vars[0];
}
虽然它有一些优点,但不确定这是否是一个好主意,但您也可以使用关联数组
function funcname($vars){
echo $vars['var1'];
}
只需将变量放入数组中,并将数组的名称传递给函数即可
$vararray[] = 'var1text';
$vararray[] = 'var2text';
$vararray[] = 'var3text';
funcname($vararray);
function funcname($variable_array){
echo $variable_array[1]; // will echo var2text
}
如果您事先不知道end Developer将在函数上使用多少个变量,可以使用
func\u get\u 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']
我使用这个函数是因为您提到了这样一个事实,即您事先不知道end Developer将放置多少个参数 以后,请阅读,以便我们能够理解您的问题,从而帮助您
方法有自己的作用域,这意味着除非另外声明或传递,否则该方法将无法访问该变量
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()方法
也许你可以修改你的函数,让它接受一个数组而不是多个参数
$var1 = 'var1text';
$var2 = 'var2text';
$var3 = 'var3text';
function funcname($var1, $var2, $var3){
echo $var1;
}
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']);
也许这是更改变量列表的中心位置?如果参数列表非常不稳定,为什么不传入一个数组呢?我很乐意。我没有成功地找到正确的方法。我所有的尝试都一无所获。你能告诉我你将如何使用我提供的代码吗?你能解释一下
$var1
,$var2
等最初的来源吗?也许有不同的方法可以解决这个问题。如上所述,它们来自函数的外部。如果我使用我提交的第一段代码,它就可以正常工作。因此,这不是一个范围问题。我只想将变量压缩到一个位置,以便于更改。我需要一个变量来包含函数中使用的变量列表。请看我上面的编辑。因此,我遇到的问题是,现在必须更改对函数中变量的所有调用,以包括索引[]。那是一大堆工作。理想情况下,我希望使用最初命名的变量名,而不必包含索引。所以,数组可能不是答案。我确实知道有多少变量,只是我将从列表中进行加减,我需要一个位置来对列表进行中心更改…因此,一个包含所有变量的变量。我不确定您的问题,因为您没有提供足够的上下文。这能很好地说明你的问题吗?谢谢你…我已经在为回调做这件事了。痛苦就是定义。我不想一次又一次地改变定义中的参数。这就是我需要数组的地方。根据定义,你是指数组键吗?如果数组不是assoc数组,则不能使用splat运算符。也许会传入一个对象?我会更新我的答案我的意思是,当我定义(名称)函数并包含参数时,我需要它看起来像我上面的第二个示例代码。这正是我需要的。我不希望使用键、索引或任何其他必须在函数中编辑变量名的地方。只需一个包含$variables的$variable…。ie-$allVar=$var1、$var2、$var3。看起来很简单。没有那么多:(我不知道你的预期输出是什么在这种情况下,你想把一个变量列表传递到一个方法中,然后用它们做什么?你可以使用join()将变量连接到另一个方法上,即:函数名($arg)…名称(join(“”,[$arg1,$arg2…我已经在上面的代码中准确地说明了我需要什么。我不知道如何更好地解释它。我需要一个包含所有变量名称的变量,我将要传递到函数中。这是一个解决方案,但我试图避免改变在函数中调用变量的方式。使用我的第一个解决方案ion(上面的一个)我可以通过$va