Использовать список переменных в качестве аргументов при определении функции php

Я пытаюсь использовать список переменных в качестве аргументов при ОПРЕДЕЛЕНИИ функции. Вроде бы все должно быть прямо, но нет. Обратный вызов прост, и я могу использовать (... $ 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 не подходят для этого, но какой тогда синтаксис? Я пробовал переменные переменные ($$) - пытаюсь преобразовать строку в ссылки на имена переменных. Я пробовал массивы. Я перепробовал буквально сотни их вариантов, и у меня просто нет идей по этому поводу. Пожалуйста помоги.

Если список аргументов такой непостоянный - почему бы просто не передать массив?

Nigel Ren 20.12.2018 20:05

Я бы хотел. Мне не удалось найти правильный способ сделать это. Все мои попытки ничего не дают. Можете ли вы показать мне, как бы вы это сделали, используя предоставленный мной код?

Lori 20.12.2018 20:06

Вы можете объяснить, откуда изначально берутся $var1, $var2 и т. д.? Может, есть другой способ решить эту проблему.

Don't Panic 20.12.2018 20:50

Как указано выше, они исходят непосредственно от функции. Если я использую 1-й фрагмент кода, который я отправил, он работает нормально. Так что это не вопрос объема. Я хочу только сжать переменные в одном месте для более легкого изменения. Мне нужна переменная, содержащая список переменных для использования в функции. Пожалуйста, смотрите мои правки выше.

Lori 20.12.2018 20:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
4
179
5

Ответы 5

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

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
}

Итак, проблема, с которой я столкнулся, заключается в том, что теперь все вызовы переменных внутри функции должны быть изменены, чтобы включить index []. Это тонна работы. В идеале я хотел бы использовать имена переменных в том виде, в котором они были названы изначально, без необходимости включения индекса. Так что массив не может быть ответом.

Lori 20.12.2018 20:14

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

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

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

Lori 20.12.2018 20:19

Не был уверен в вашей проблеме, потому что вы не предоставили достаточно контекста. Этот REPL.IT хорошо иллюстрирует вашу проблему?

Anwar 20.12.2018 23:34

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

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

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’));

Спасибо ... Я уже делаю это за обратный звонок. Боль - это определение. Я не хочу снова и снова менять аргументы в определении. Вот где мне нужен массив.

Lori 20.12.2018 20:29

Вы по определению имеете в виду ключ массива? Вы не можете использовать оператор splat, если массив не является ассоциированным массивом. Может пройти в объект? Я обновлю свой ответ

Jaquarh 20.12.2018 20:34

Я имею в виду, что когда я определяю (называю) функцию и включаю аргументы, мне нужно, чтобы она выглядела как мой второй пример кода выше. Это именно то, что мне нужно. Я бы предпочел не использовать ключи, индексы или что-либо еще, где мне пришлось бы редактировать имена переменных внутри функции. Просто $ переменная, содержащая $ переменные .... т.е. - $ allVar = $ var1, $ var2, $ var3. Кажется просто. Не так много :(

Lori 20.12.2018 20:36

Я не понимаю, каков ваш ожидаемый результат в этом случае, вы хотите передать список переменных в метод и что с ними делать? Вы можете использовать join () для соединения переменных друг с другом, например: имя функции ($ arg) ... name (join (‘‘, [$ arg1, $ arg2 ...

Jaquarh 20.12.2018 20:39

Я проиллюстрировал именно то, что мне нужно, в приведенном выше коде. Я не знаю, как это лучше объяснить. Мне нужна переменная, содержащая все имена переменных, которые я собираюсь передать функции.

Lori 20.12.2018 20:43

У него есть доступ к переменным за пределами его области действия, если он вызывается в функции. Мне нужен только их список. Может быть трудно ответить, поэтому я спрашиваю, но предположение, что «никто не может ответить», бесполезно. Если у вас есть решение или другой способ сделать это, сообщите мне, и я буду рад его попробовать.

Lori 20.12.2018 21:01

Политика здесь изменилась. В жестоком обращении нет необходимости. Если у вас нет решения, продолжайте.

Lori 20.12.2018 22:18

Обновил ответ, ругани нет. Вы просто не предоставили MCVE ожидаемые входы и выходы, и вы не можете принимать структурированную критику.

Jaquarh 20.12.2018 22:31

Да, я сделал. Это в моем первоначальном вопросе. Пожалуйста, воздержитесь от дальнейших комментариев. Я уже сообщил о ваших комментариях. Я здесь, потому что мне нужна помощь. Больше ничего не интересует.

Lori 20.12.2018 22:32

"It does have access to variables beyond it's scope if it is called into the function" Я оставлю это там, где будет ваш ответ :) Постарайтесь дальше себе не противоречить

Jaquarh 20.12.2018 22:36

$$ работает с 1 переменной. Как заставить работать с 2? Я уже использовал этот метод раньше, но не могу использовать более одной переменной. Я уверен, что дело в синтаксисе, но, поскольку я не знаю, как это сделать, я спрашиваю, как это сделать.

Lori 20.12.2018 22:40

Я обновлю свой вопрос, чтобы теперь использовать несколько переменных

Jaquarh 20.12.2018 22:41

Обновлено, надеюсь, поможет. Я не имел в виду оскорблений, но ваш вопрос был непонятным, хотя, по общему признанию, трудно объяснить. Возможно, создав минимальный, полный и проверяемый пример, когда вы в следующий раз зададите вопрос, это поможет нам понять его в будущем.

Jaquarh 20.12.2018 22:44

К сожалению, я не думаю, что это решение, которое я могу использовать. Насколько я могу судить, мне по-прежнему требуется, чтобы я переходил к каждой функции, использующей эти аргументы, и менял функцию. У меня много функций, использующих общий список аргументов. Я просто стараюсь избегать изменения каждой функции каждый раз, когда мне нужно добавить еще один аргумент.

Lori 20.12.2018 22:49

Это то, что мне нужно, и то, что я написал для начала. $ Var1 = 'var1text'; $ var2 = 'var2text'; $ var3 = 'var3text'; $ listOfVar = $ var1, $ var2, $ var3; функция имя_функции ($ listOfVar) {эхо $ var1; } Мне нужно изменить $ listOfVar и заставить функцию распознавать его. Я могу это сделать, если неявно назову каждый аргумент. Но пока другого пути нет.

Lori 20.12.2018 22:50

Позвольте нам продолжить обсуждение в чате.

Jaquarh 20.12.2018 23:02

Привет, @Jaquarh, можем ли мы поговорить, когда у тебя будет минутка?

Lori 17.02.2019 19:43

Обязательно напишите мне ссылку в чате: я сейчас на моем телефоне, поэтому не могу сгенерировать @Lori

Jaquarh 17.02.2019 19:46

Lmao или другие средства связи меня не беспокоят @Lori

Jaquarh 17.02.2019 19:50

У меня должно быть 100 пунктов, чтобы открыть чат. Я просто опубликую свой вопрос и посмотрю, получат ли на него ответ, а меня не выгонят. @Jaquarh

Lori 17.02.2019 19:55

Lmao запускает его, пока он содержит минимально полный и проверяемый пример, ur unouchable;) У меня есть группа разработчиков в WhatsApp, если когда-либо будет легче связаться с нами таким образом, хорошо для идей и т. д., Но я оставлю мяч в Ваш суд за это - не стесняйтесь размещать ссылку на свой вопрос, и я взгляну на нее @Lori

Jaquarh 17.02.2019 19:58

Позвольте нам продолжить обсуждение в чате.

Lori 17.02.2019 20:05

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

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

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

Это решение, но я стараюсь не менять способ вызова переменных внутри функции. В моем первом решении (которое работает выше) я могу передать переменную $ в функцию и использовать ее так, как она уже названа. С этим массивом мне пришлось бы изменить все ссылки в функции, чтобы ссылаться на него с помощью индекса ... или я мог ошибаться?

Lori 20.12.2018 21:05

Нет, не ошибаюсь. Если вы передадите массив, вам нужно будет ссылаться на элементы в нем по индексу, если вы не используете extract внутри функции. Но я не понимаю, как вы относитесь к отдельным переменным внутри функции, не зная, какие из них будут ей переданы.

Don't Panic 20.12.2018 21:09

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

Lori 20.12.2018 21:13

О, значит проблема не столько в одной функции, сколько в том, что у вас есть несколько функций, которые должны принимать один и тот же список аргументов?

Don't Panic 20.12.2018 21:14

ОМГ ДА. Это правильно! Думаю, я плохо объяснял эту часть.

Lori 20.12.2018 21:14

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

Don't Panic 20.12.2018 21:16

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

Lori 20.12.2018 21:17

Я должен изучить это какое-то время, так как я никогда не делал этого таким образом, и это сбивает меня с толку, так как использовались разные имена, поэтому мне придется разобраться. Выглядит отлично, и я ценю помощь.

Lori 20.12.2018 22:46

Пожалуйста. Надеюсь, это действительно поможет, и я все еще не понимаю. :-) Я изменил некоторые имена там, чтобы лучше соответствовать примерам в вашем вопросе.

Don't Panic 20.12.2018 23:07

Другие вопросы по теме