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






Если вместо этого вы используете массив для переданных данных ...
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 []. Это тонна работы. В идеале я хотел бы использовать имена переменных в том виде, в котором они были названы изначально, без необходимости включения индекса. Так что массив не может быть ответом.
Если вы не знаете заранее, сколько переменных конечный разработчик будет использовать в вашей функции, вы можете использовать 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']
Я использовал эту функцию, потому что вы упомянули тот факт, что вы не знаете заранее, сколько параметров собирается поставить конечный разработчик.
Я знаю, сколько там переменных, просто я буду добавлять и вычитать из списка, и мне нужно место, чтобы сделать центральное изменение в списке ... следовательно, переменная, которая содержит все переменные.
Не был уверен в вашей проблеме, потому что вы не предоставили достаточно контекста. Этот REPL.IT хорошо иллюстрирует вашу проблему?
В будущем прочтите Как создать минимальный, полный и проверяемый пример, чтобы мы могли понимать ваш вопрос, чтобы помочь вам.
У методов есть собственная область видимости, то есть, если иное не объявлено или не передано, метод не будет иметь доступа к переменной.
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’));
Спасибо ... Я уже делаю это за обратный звонок. Боль - это определение. Я не хочу снова и снова менять аргументы в определении. Вот где мне нужен массив.
Вы по определению имеете в виду ключ массива? Вы не можете использовать оператор splat, если массив не является ассоциированным массивом. Может пройти в объект? Я обновлю свой ответ
Я имею в виду, что когда я определяю (называю) функцию и включаю аргументы, мне нужно, чтобы она выглядела как мой второй пример кода выше. Это именно то, что мне нужно. Я бы предпочел не использовать ключи, индексы или что-либо еще, где мне пришлось бы редактировать имена переменных внутри функции. Просто $ переменная, содержащая $ переменные .... т.е. - $ allVar = $ var1, $ var2, $ var3. Кажется просто. Не так много :(
Я не понимаю, каков ваш ожидаемый результат в этом случае, вы хотите передать список переменных в метод и что с ними делать? Вы можете использовать join () для соединения переменных друг с другом, например: имя функции ($ arg) ... name (join (‘‘, [$ arg1, $ arg2 ...
Я проиллюстрировал именно то, что мне нужно, в приведенном выше коде. Я не знаю, как это лучше объяснить. Мне нужна переменная, содержащая все имена переменных, которые я собираюсь передать функции.
У него есть доступ к переменным за пределами его области действия, если он вызывается в функции. Мне нужен только их список. Может быть трудно ответить, поэтому я спрашиваю, но предположение, что «никто не может ответить», бесполезно. Если у вас есть решение или другой способ сделать это, сообщите мне, и я буду рад его попробовать.
Политика здесь изменилась. В жестоком обращении нет необходимости. Если у вас нет решения, продолжайте.
Обновил ответ, ругани нет. Вы просто не предоставили MCVE ожидаемые входы и выходы, и вы не можете принимать структурированную критику.
Да, я сделал. Это в моем первоначальном вопросе. Пожалуйста, воздержитесь от дальнейших комментариев. Я уже сообщил о ваших комментариях. Я здесь, потому что мне нужна помощь. Больше ничего не интересует.
"It does have access to variables beyond it's scope if it is called into the function" Я оставлю это там, где будет ваш ответ :) Постарайтесь дальше себе не противоречить
$$ работает с 1 переменной. Как заставить работать с 2? Я уже использовал этот метод раньше, но не могу использовать более одной переменной. Я уверен, что дело в синтаксисе, но, поскольку я не знаю, как это сделать, я спрашиваю, как это сделать.
Я обновлю свой вопрос, чтобы теперь использовать несколько переменных
Обновлено, надеюсь, поможет. Я не имел в виду оскорблений, но ваш вопрос был непонятным, хотя, по общему признанию, трудно объяснить. Возможно, создав минимальный, полный и проверяемый пример, когда вы в следующий раз зададите вопрос, это поможет нам понять его в будущем.
К сожалению, я не думаю, что это решение, которое я могу использовать. Насколько я могу судить, мне по-прежнему требуется, чтобы я переходил к каждой функции, использующей эти аргументы, и менял функцию. У меня много функций, использующих общий список аргументов. Я просто стараюсь избегать изменения каждой функции каждый раз, когда мне нужно добавить еще один аргумент.
Это то, что мне нужно, и то, что я написал для начала. $ Var1 = 'var1text'; $ var2 = 'var2text'; $ var3 = 'var3text'; $ listOfVar = $ var1, $ var2, $ var3; функция имя_функции ($ listOfVar) {эхо $ var1; } Мне нужно изменить $ listOfVar и заставить функцию распознавать его. Я могу это сделать, если неявно назову каждый аргумент. Но пока другого пути нет.
Позвольте нам продолжить обсуждение в чате.
Привет, @Jaquarh, можем ли мы поговорить, когда у тебя будет минутка?
Обязательно напишите мне ссылку в чате: я сейчас на моем телефоне, поэтому не могу сгенерировать @Lori
Lmao или другие средства связи меня не беспокоят @Lori
У меня должно быть 100 пунктов, чтобы открыть чат. Я просто опубликую свой вопрос и посмотрю, получат ли на него ответ, а меня не выгонят. @Jaquarh
Lmao запускает его, пока он содержит минимально полный и проверяемый пример, ur unouchable;) У меня есть группа разработчиков в WhatsApp, если когда-либо будет легче связаться с нами таким образом, хорошо для идей и т. д., Но я оставлю мяч в Ваш суд за это - не стесняйтесь размещать ссылку на свой вопрос, и я взгляну на нее @Lori
Позвольте нам продолжить обсуждение в чате.
Возможно, вы могли бы изменить свою функцию так, чтобы она принимала массив вместо нескольких аргументов.
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 внутри функции. Но я не понимаю, как вы относитесь к отдельным переменным внутри функции, не зная, какие из них будут ей переданы.
Я знаю, какие переменные будут переданы. Суть в том, что мне нужно центральное место для изменения списка всякий раз, когда мне нужно, без перехода к каждой отдельной функции для изменения передаваемых переменных. Это вроде того. Я знаю, что это сбивает с толку, поэтому я рву волосы.
О, значит проблема не столько в одной функции, сколько в том, что у вас есть несколько функций, которые должны принимать один и тот же список аргументов?
ОМГ ДА. Это правильно! Думаю, я плохо объяснял эту часть.
Ааа, ладно, тогда у меня есть другая идея. Я отредактирую этот ответ. Вы могли бы изменить эти различные функции, не так ли? Они не определены в другом месте?
Я могу их модифицировать. Я просто пытаюсь сохранить 100 изменений каждый раз, когда мне нужно добавить новую переменную ко всем функциям.
Я должен изучить это какое-то время, так как я никогда не делал этого таким образом, и это сбивает меня с толку, так как использовались разные имена, поэтому мне придется разобраться. Выглядит отлично, и я ценю помощь.
Пожалуйста. Надеюсь, это действительно поможет, и я все еще не понимаю. :-) Я изменил некоторые имена там, чтобы лучше соответствовать примерам в вашем вопросе.
Если список аргументов такой непостоянный - почему бы просто не передать массив?