簡體   English   中英

定義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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM