Использовать список переменных в качестве аргументов при определении функции php - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь использовать список переменных в качестве аргументов при определении функции.Кажется, это должно быть прямо вперед, но нет.Обратный вызов прост, и я могу использовать (... $ listOfVariables), чтобы получить все необходимые аргументы в обратный вызов, но он не работает при определении функции.

Мне это нужно, потому что у меня 50 различных функцийкоторые требуют использования всех одинаковых аргументов.Когда список аргументов изменяется (что и происходит), мне нужно центральное расположение, чтобы все новые функции использовали новый список аргументов.(Опять же, я уже могу сделать это с помощью обратного вызова, но не тогда, когда я определяю функцию)

Вот как я обычно делаю это для нескольких аргументов.

$var1 = 'var1text';
$var2 = 'var2text';
$var3 = 'var3text';


function funcname($var1, $var2, $var3){

    echo $var1;
}

Это работаетхорошо, но мой список переменных сильно меняется и используется во многих других функциях.Я могу ошибаться, и я открыт для любых ваших предложений.Вот что мне нужно сделать:

EDITED

1. переменные, которые определены вне функции

$var1 = 'var1text';
$var2 = 'var2text';
$var3 = 'var3text';

2.a переменнаякоторый содержит все эти переменные

$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 не верны для этого, но что такое синтаксис тогда?Я пробовал переменные переменные ($$) - пытался преобразовать строку в ссылки на имена переменных.Я пробовал массивы.Я пробовал буквально сотни их вариантов, и у меня просто нет идей для этого.Пожалуйста помоги.

Ответы [ 5 ]

0 голосов
/ 20 декабря 2018

Возможно, вы могли бы изменить свою функцию так, чтобы она принимала массив вместо нескольких аргументов.

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']);

Может быть, это может быть центральное место для изменения списка переменных?

0 голосов
/ 20 декабря 2018

В будущем прочитайте Как создать минимальный, полный и проверяемый пример , чтобы мы могли понять ваш вопрос, чтобы помочь вам.

Методысуществует собственная область, то есть, если иное не объявлено или не передано, метод не будет иметь доступа к переменной.

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

Live demo .

Или вы можете использоватьметод list ()

function name($listOfVars) { 
    list($var1, $var2) = $listOfVars;
    echo $var1;
}

name(array(‘var1text’, ‘var2text’));
0 голосов
/ 20 декабря 2018

Просто поместите ваши переменные в массив и передайте имя массива вашей функции.

$vararray[] = 'var1text';
$vararray[] = 'var2text';
$vararray[] = 'var3text';
funcname($vararray);

function funcname($variable_array){
    echo $variable_array[1];  // will echo var2text
}
0 голосов
/ 20 декабря 2018

Если вы заранее не знаете, сколько переменных будет использовать конечный разработчик в вашей функции, вы можете использовать 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']

Я использовал эту функцию, потому что вы упомянули тот факт, что вы заранее не знаете, сколько параметровконец разработчик собирается поставить.

0 голосов
/ 20 декабря 2018

Если вместо этого вы используете массив для передаваемых данных ...

function funcname($vars){
    echo $vars[0];
}

Хотя у него есть преимущества, я не уверен, что это будет хорошей идеей, но вы также можете использовать ассоциативный массив ...

function funcname($vars){
    echo $vars['var1'];
}
...