提问人:Lori 提问时间:12/21/2018 最后编辑:Lori 更新时间:12/21/2018 访问量:499
定义 php 函数时使用变量列表作为参数
Use list of variables as arguments when defining php function
问:
我尝试在定义函数时使用变量列表作为参数。看起来它应该是直截了当的,但不是。回调很容易,我可以使用 (...$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语法中的逗号对此不正确,但是语法是什么?我尝试过变量 ($$) - 尝试将字符串转换为变量名称引用。我试过数组。我已经尝试了数百种变体,但我对此毫无想法。请帮忙。
答:
相反,如果您使用数组来传递数据...
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
}
评论
如果您事先不知道最终开发器将在函数上使用多少个变量,则可以使用 .它以数组形式返回每个变量值。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']
我之所以使用这个函数,是因为你提到了一个事实,即你事先不知道最终开发器将放置多少个参数。
评论
将来,请阅读如何创建最小、完整和可验证的示例,以便我们了解您的问题,以便为您提供帮助。
方法有自己的作用域,这意味着除非另有声明或传递,否则该方法将无法访问变量。
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’));
评论
也许你可以修改你的函数,让它接受一个数组而不是多个参数。
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']);
也许这可能是更改变量列表的中心位置?
评论
extract
评论
$var1
$var2