Неопределенное количество аргументов php
Можно ли сделать функцию PHP, которая будет принимать любое количество аргументов?
Я пишу некоторый код PHP, который будет генерировать файлы HTML из шаблонов.
Я хотел бы, если возможно, создать функцию, которая будет принимать любые строки, которыми я подпитываю функцию, и помещать это в файл. Вот так:
Мне это нужно, потому что на разных страницах будет разное количество включаемых файлов, и с этим я смогу пропустить создание разных функций для конкретных страниц. Просто итератор, и все тут.
Решение
Итак, ваша функция будет выглядеть примерно так:
Другие решения
Вы можете сделать это, используя массив следующим образом:
Вы можете передать массив напрямую для вызова функции следующим образом:
Просто используйте func_get_args(); внутри вашей функции, чтобы вернуть массив всех аргументов, переданных в.
Вы также можете использовать func_get_arg($arg_num) вернуть конкретный аргумент, или func_num_args вернуть количество аргументов.
Все функции PHP допускают любое количество параметров, они просто не могут быть вызваны по имени, единственный способ — использовать эти 3 функции.
Обратите внимание, что вы можете использовать переменный аргумент как последний в списке параметров следующим образом:
В процессе хорошего дизайна я бы тщательно продумал, когда и где использовать такие вещи, как эта. Например, в настоящее время я работаю над проектом, который, вероятно, содержит более 200 тыс. Строк кода, и, что еще хуже, на самом деле он никогда не используется.
Наиболее распространенный способ — передать массив «struct» методу:
Если вы хотите иметь больший контроль над данными, вы можете создать структуру и получить доступ к ней внутри класса. Публичные функции действуют как обработчики.
В более редких случаях у вас может быть элемент управления, подобный C ++, где вы используете класс просто как структуру:
Уже упоминалось «…», которое я почти никогда не вижу, но это интересно, но насколько полезно? Помогает ли это объяснить, что происходит?
Обычно в методах вы увидите множество вещей, которые помогут четко сформулировать цель этого.
Неопределенное количество аргументов php
Передача аргументов пользовательским функциям
При объявлении функции можно указать список параметров, которые могут передаваться функции, например:
При вызове функции funct() нужно указать все передаваемые параметры, поскольку они являются обязательными. В PHP пользовательские функции могут обладать необязательными параметрами или параметрами по умолчанию, но об этом позже.
Передача аргументов по ссылке
Согласно сложившимся традициям, во всех языках программирования есть два вида аргументов функций:
По умолчанию аргументы в функцию передаются по значению (это означает, что если вы измените значение аргумента внутри функции, то вне ее значение все равно останется прежним). Приведем пример:
// Функция ‘funct’ выведет строку ‘Параметр = 777’ дважды
В отличие от параметров-значений, параметры-переменные могут быть изменены в процессе работы функции. Тут уже нельзя передавать значение, нужно обязательно передать переменную. В PHP для объявления параметров-переменных используется механизм передачи переменной по ссылке.
Если вы хотите разрешить функции модифицировать свои аргументы, вы должны передавать их по ссылке.
Если вы хотите, что бы аргумент всегда передавался по ссылке, вы должны указать амперсанд (&) перед именем аргумента в описании функции:
Параметры по умолчанию
При программировании часто возникает необходимость создания функции с переменным числом параметров. Тому есть две причины:
В PHP функции могут возвращать любые значения в зависимости от переданных им параметров.
Результат работы приведенного скрипта будет таким:
Сделайте чашечку Чая
Сделайте чашечку Кофе
PHP также позволяет использовать массивы и специальный тип NULL в качестве значений по умолчанию, например:
Рассмотренный скрипт выведет следующее:
Значение по умолчанию должно быть константным выражением.
Обратите внимание, что все аргументы, для которых установлены значения по умолчанию, должны находится правее аргументов, для которых значения по умолчанию не заданы, в противном случае ваш код может работать не так, как вы этого ожидаете. Рассмотрим следующий пример:
echo makecup ( «горячего» ); // Не будет работать так, как мы могли бы ожидать
?>
Результат работы приведенного выше скрипта будет примерно следующим:
Теперь видоизменим рассмотренный скрипт, исправив в нем ошибки:
echo makecup ( «горячего» ); // Теперь наш скрипт работает корректно!
?>
Результат работы исправленного скрипта будет выглядеть следующим образом:
Сделайте чашечку чая горячего.
Внимание! Начиная с PHP 5, значения по умолчанию могут быть переданны по ссылке!
Переменное число аргументов в функциях
Иногда мы точно не знаем, сколько параметров будет передано нашей функции. Специально для такого случая разработчики PHP предусмотрели возможность использования переменного числа аргументов.
Рассмотрим возможности рассмотренных стандартных функций:
Стандартная функция func_num_args() возвращает колличество аргументов, переданных пользовательской функции:
Стандартная функция func_get_arg() возвращает элемент из списка переданных пользовательской функции аргументов:
Стандартная функция func_get_args() возвращает массив аргументов, переданных пользовательской функции:
Обратите внимание, что при объявлении пользовательских функций в скобках мы ничего не пишем, то есть, как будто мы не передаем аргументы.
PHP-функция с необязательными параметрами
Я написал функцию PHP, которая может принимать 10 параметров, но требуется только 2. Иногда я хочу определить восьмой параметр, но я не хочу вводить пустые строки для каждого из параметров, пока не достигну восьмого.
Одна из моих идей состояла в том, чтобы передать абстрактную функцию с массивом параметров, который передает ее в реальную функцию.
Есть ли лучший способ настроить функцию так, чтобы я мог передавать только те параметры, которые мне нужны?
11 ответов:
Пусть функция принимает один параметр: массив. Передайте фактические параметры в виде значений в массиве.
Примечание: это старый пост, но может помочь кому-то сейчас или в будущем.
Вы можете достичь этого, используя один из этих 2 методов:
Как использовать
Я предпочитаю второй метод, потому что он чистый и простой для понимания, но иногда вам может понадобиться первый метод.
Приведенный выше пример выведет:
Я думаю, что вы также можете использовать объекты в качестве params-transportes.
Конечно, вы должны установить значения по умолчанию для «optParam8» и «optParam2» в этой функции, в другом случае вы получите «Notice: Undefined property: stdClass::$optParam2»
При использовании массивов в качестве параметров функции мне нравится этот способ установки значений по умолчанию:
Если для создания объекта с допустимым состоянием требуется только два значения, можно просто удалить все остальные необязательные Аргументы и предоставить для них задатчики (если только вы не хотите, чтобы они изменялись во время выполнения). Затем просто создайте экземпляр объекта с двумя требуемыми аргументами и установите остальные по мере необходимости через сеттер.
Я знаю, что это старый пост, но у меня была проблема, как с операцией, и вот что я придумал.
Пример массива, который вы можете передать. Вы можете повторно заказать это, если требуется конкретный заказ, но для этого вопроса это будет делать то, что задано.
Это управляемо, легко читается, и точки извлечения данных могут быть добавлены и удалены в любой момент в любом месте кодирования и все еще избежать массивной перезаписи. Я использовал целочисленные ключи для подсчета с оригиналом OP вопрос, но строковые ключи могут быть использованы так же легко. На самом деле для удобства чтения я бы посоветовал это сделать.
Вставьте это во внешний файл для удобства
Поместите это в начало, если файл.
Просто используйте их для назначения следующей части данных используйте нумерацию / именование в соответствии с тем, откуда поступают данные.
И, наконец, передать массив
Вы можете просто установить значение по умолчанию в null.
Если вы обычно просто передаете 8-е значение, вы можете изменить порядок параметров, чтобы оно было первым. Вам нужно только указать параметры до последнего, который вы хотите установить.
Если вы используете разные значения, у вас есть 2 варианта.
Можно было бы создать набор функций-оболочек, которые принимают различные параметры и устанавливают значения по умолчанию для остальных. Это полезно, если вы используете только несколько комбинаций, но может очень быстро запутаться.
Другой вариант-пройти массив, в котором ключи являются именами параметров. Затем вы можете просто проверить, есть ли значение в массиве с ключом, и если нет, то использовать значение по умолчанию. Но опять же, это может стать грязным и добавить много дополнительного кода, если у вас есть много параметров.
Неопределенное количество аргументов php
To experiment on performance of pass-by-reference and pass-by-value, I used this script. Conclusions are below.
3 valuue yes 129 s
4 reference yes 66 us
1. PHP is already smart about zero-copy / copy-on-write. A function call does NOT copy the data unless it needs to; the data is
only copied on write. That’s why #1 and #2 take similar times, whereas #3 takes 2 million times longer than #4.
[You never need to use &$array to ask the compiler to do a zero-copy optimisation; it can work that out for itself.]
2. You do use &$array to tell the compiler «it is OK for the function to over-write my argument in place, I don’t need the original
any more.» This can make a huge difference to performance when we have large amounts of memory to copy.
(This is the only way it is done in C, arrays are always passed as pointers)
3. The other use of & is as a way to specify where data should be *returned*. (e.g. as used by exec() ).
(This is a C-like way of passing pointers for outputs, whereas PHP functions normally return complex types, or multiple answers
in an array)
5. Sometimes, pass by reference could be at the choice of the caller, NOT the function definitition. PHP doesn’t allow it, but it
would be meaningful for the caller to decide to pass data in as a reference. i.e. «I’m done with the variable, it’s OK to stomp
on it in memory».
*/
?>
A function’s argument that is an object, will have its properties modified by the function although you don’t need to pass it by reference.
In function calls, PHP clearly distinguishes between missing arguments and present but empty arguments. Thus:
The best approach, it seems to me, is to always use a sentinel like null as the default value of an optional argument. This way, callers like g and g’s clients have many options, and furthermore, callers always know how to omit arguments so they can omit one in the middle of the parameter list.
PASSING A «VARIABLE-LENGTH ARGUMENT LIST OF REFERENCES» TO A FUNCTION
As of PHP 5, Call-time pass-by-reference has been deprecated, this represents no problem in most cases, since instead of calling a function like this:
myfunction($arg1, &$arg2, &$arg3);
provided you have defined your function as
function myfuncion($a1, &$a2, &$a3) < // so &$a2 and &$a3 are
// declared to be refs.
.
>
In the following code I tried to amend this by using the
array() language-construct as the actual argument in the
call to the function.
Функция PHP с неограниченным количеством параметров
Как написать функцию, которая может принимать неограниченное количество параметров?
То, что я пытаюсь сделать, это создать функцию внутри класса, которая включает следующее:
Вышеприведенные предложения все хороши, но я не думаю, что они будут подходящими для вашей ситуации.
Если вы хотите обернуть эту функцию, вам нужно будет передать ссылки на исходные переменные аргумента функции bind_param. Я не думаю, что func_get_args () дает вам это, он дает вам значения. Таким образом, невозможно будет использовать их для перехода к родительской функции. Я сражался с подобной проблемой, пытаясь расширить mysqli_stmt и никогда не получал удовлетворительного решения.
На самом деле это не ответ на ваш вопрос, я боюсь, просто предупреждение о том, что другие аргументы могут не работать в вашем конкретном приложении произвольного количества аргументов.
РЕДАКТИРОВАТЬ
Относительно комментария Эвана Тодса:
У меня нет каких-либо знаний базового API, для которого вы создаете оболочку, но другой альтернативой может быть что-то сделать с функциями цепочки, чтобы ваш получившийся интерфейс выглядел примерно так:
Который я бы предпочел использовать func_get_args, поскольку код, вероятно, более читабельен и, что более важно, менее вероятно, приведет к ошибкам из-за отсутствия переменной формата.
Так, например, вы можете написать функцию, которая возвращает вам сумму всех чисел, отправленных функции:
Ваши params на самом деле являются массивом всех элементов.
См. Также Введение рефакторинга объектов параметров на сайте refactoring.com.
Если вы используете PHP 5.6 или более позднюю версию, списки аргументов могут включать . токен, чтобы обозначить, что функция принимает переменное количество аргументов. Аргументы будут переданы в заданную переменную в виде массива; Просто используя . вы можете получить доступ к неограниченным переменным аргументам.