在定义函数时,我尝试使用变量列表作为参数。似乎应该是直截了当的,但不是。回调很容易,我可以使用(... $ 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.include我可以在函数中使用的变量列表,因此不必像在第一段代码中那样一次列出它们。
function funcname($listOfVar){
echo $var1;
}
我要制作的完整代码:
$var1 = 'var1text';
$var2 = 'var2text';
$var3 = 'var3text';
$listOfVar = $var1, $var2, $var3;
function funcname($listOfVar){
echo $var1;
}
**我意识到$ listOfVar语法中的逗号对此不正确,但是语法是什么呢?我已经尝试了变量变量($$)-尝试将字符串转换为变量名称引用。我试过数组。我已经尝试了这些方法的数百种变体,但我对此没有任何想法。请帮忙。
答案 0 :(得分:1)
如果您事先不知道最终开发人员将在函数上使用多少个变量,则可以使用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']
我之所以使用此函数,是因为您提到了一个事实,即您事先不知道最终开发人员要输入多少个参数。
答案 1 :(得分:0)
如果相反,您使用数组作为传递的数据...
function funcname($vars){
echo $vars[0];
}
尽管它具有优点,但不确定是否会是一个好主意,但是您也可以使用关联数组...
function funcname($vars){
echo $vars['var1'];
}
答案 2 :(得分:0)
将来,请阅读How to create a Minimal, Complete, and Verifiable example,以便我们了解您的问题,以为您提供帮助。
方法有自己的作用域,这意味着除非另行声明或通过,否则方法将无法访问变量。
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
实时demo。
或者您可以使用list()方法
function name($listOfVars) {
list($var1, $var2) = $listOfVars;
echo $var1;
}
name(array(‘var1text’, ‘var2text’));
答案 3 :(得分:0)
也许您可以修改函数,使其采用数组而不是多个参数。
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']);
也许这可能是更改变量列表的中心位置?
答案 4 :(得分:-1)
只需将变量放入数组中,然后将数组的名称传递给函数即可。
$vararray[] = 'var1text';
$vararray[] = 'var2text';
$vararray[] = 'var3text';
funcname($vararray);
function funcname($variable_array){
echo $variable_array[1]; // will echo var2text
}