![](/img/trans.png)
[英]How to use a function with several arguments without defining them in advance, with 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.include 我可以在函數中使用的變量列表,這樣我就不必像在第一個片段中那樣一次列出一個。
function funcname($listOfVar){
echo $var1;
}
我正在嘗試制作的完整代碼:
$var1 = 'var1text';
$var2 = 'var2text';
$var3 = 'var3text';
$listOfVar = $var1, $var2, $var3;
function funcname($listOfVar){
echo $var1;
}
**我意識到 $listOfVar 語法中的逗號對此不正確,但是語法是什么? 我試過變量變量 ($$) - 試圖將字符串轉換為變量名引用。 我試過數組。 我已經嘗試了數百種這些變體,但我對此毫無想法。 請幫忙。
如果您事先不知道最終開發人員將在您的函數上使用多少個變量,您可以使用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']
我使用這個函數是因為你提到了一個事實,即你不知道最終開發者要放多少參數。
相反,如果您對傳遞的數據使用數組...
function funcname($vars){
echo $vars[0];
}
雖然它有優點不確定這是否是一個好主意,但你也可以使用關聯數組......
function funcname($vars){
echo $vars['var1'];
}
以后,請閱讀如何創建最小、完整和可驗證的示例,以便我們了解您的問題以幫助您。
方法有自己的作用域,這意味着除非另外聲明或傳遞,否則方法將無法訪問該變量。
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']);
也許這可能是更改變量列表的中心位置?
只需將您的變量放在一個數組中,然后將數組的名稱傳遞給您的函數。
$vararray[] = 'var1text';
$vararray[] = 'var2text';
$vararray[] = 'var3text';
funcname($vararray);
function funcname($variable_array){
echo $variable_array[1]; // will echo var2text
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.