Php неограниченное количество аргументов

PHP функция с неограниченным количеством параметров

Как написать функцию, которая может принимать неограниченное количество параметров? Что нужно сделать, так это создать функцию внутри класса, которая обертывает следующее:

$stmt->bind_param('sssd', $code, $language, $official, $percent); 

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

Спасибо за информацию. К сожалению, PDO кажется излишним, требует еще больше усилий и шаблонов, чем просто писать свои собственные простые вещи.

8 ответов

Вышеприведенные предложения хороши, но я не думаю, что они будут подходящими для вашей ситуации.

$stmt->bind_param('sssd', $code, $language, $official, $percent); 

Если вы хотите обернуть эту функцию, вам нужно будет передать ссылки на исходные переменные аргумента функции bind_param. Я не думаю, что func_get_args() дает вам это, он дает вам значения. Таким образом, невозможно будет использовать их для перехода к родительской функции. Я сражался с подобной проблемой, пытаясь расширить mysqli_stmt и никогда не получал удовлетворительного решения.

На самом деле это не ответ на ваш вопрос, я боюсь, просто предупреждение о том, что другие аргументы могут не работать в вашем конкретном приложении произвольного количества аргументов.

В самом деле. В прошлый раз, когда я проверял (1+ год назад), не было способа обернуть / расширить bind_param() потому что func_get_args() не будет возвращать ссылки.

function bind_param() < if ( func_num_args() $format = func_get_arg(0) $args = array_slice(func_get_args(), 1) //etc > 

ИЗМЕНИТЬ
Относительно комментария Эвана Тодса:
У меня нет каких-либо знаний базового API, для которого вы создаете оболочку, но другой альтернативой может быть что-то сделать с функциями цепочки, чтобы ваш получившийся интерфейс выглядел примерно так:

$var->bind()->bindString($code) ->bindString($language) ->bindString($official) ->bindDecimal($percent); 

Что я предпочел бы использовать func_get_args, поскольку код, вероятно, более читабельный и, что более важно, менее вероятно, приведет к ошибкам из-за отсутствия переменной формата.

Я использую func_get_args время от времени. Он страдает от того, что трудно сразу увидеть, что представляет собой метод. Кроме того, он вводит блок неприятного синтаксиса в ваш код. Я бы рекомендовал этот подход только в крайнем случае. Предпочитаю рефакторинг объекта параметров.

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

Мне нравится предложение «функции цепочки» лучше, чем func_get_args. Я знаю этот дизайн как интерфейс FLUENT. Это достигается с помощью bindString (), bindDecimal () и т. Д., Которые возвращают $ this; как их последняя строка. Интерфейс FLUENT является отличным вариантом для некоторых типов заводов.

Раньше вы должны были использовать func_get_args() , но в php 5.6 вы можете использовать . operator.

Так, например, вы можете написать функцию, которая возвращает вам сумму всех чисел, отправленных функции:

function bind_param(. $params)

Ваш params представляет собой массив всех элементов.

Это не работает, если параметры не установлены, а затем передаются по ссылке для установки внутри функции. func_get_args пытается получить доступ к переменной unset, которая выдает ошибку.

Если вы используете PHP 5.6 или более позднюю версию, списки аргументов могут включать токен . , чтобы обозначить, что функция принимает переменное количество аргументов. Аргументы будут переданы в заданную переменную в виде массива; Просто используя . , вы можете получить доступ к неограниченным переменным аргументам.

 return $sum ; > echo sum(1, 2, 3, 4, 5); ?> 
= 2) < echo "Second argument is: " . func_get_arg(1) . "\n"; >$arg_list = func_get_args(); for ($i = 0; $i < $numargs; $i++) < echo "Argument $i is: " . $arg_list[$i] . "\n"; >> foo(1, 2, 3); ?> 

В 5 параметрах этот дизайн начинает демонстрировать AntiPattern Слишком много параметров «. Это предполагает рефакторинг, называемый » Объект параметров «, объект или структура с элементами данных, представляющими аргументы, которые должны быть переданы. Однако избегайте создания a Magic Container.

См. также Внедрить объект параметров, рефакторинг на сайте refactoring.com.

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

Что вы можете сделать, это определить функцию, которая принимает большое количество аргументов и по умолчанию имеет значение null. Затем внутри этой функции добавьте каждую ненулевую ссылку на массив, который затем будет использоваться для вызова * bind_param() *, используя * call_user_func_array() *.

function my_bind_param(&$stmt, $types, &$arg1, &$arg2 = null, &$arg3 = null, . ) < $vars = array($types); $vars[] = $arg1; if ($arg2 != null) $vars[] = &$arg2; if ($arg3 != null) $vars[] = &$arg3; . if (!call_user_func_array(array($stmt, "bind_param"), $vars)) < if ($stmt->errno == 0) return array(-1, "Unknown error binding parameters."); else return array(-1, "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error); > return array(0, ""); > 

Настоящий трюк заключается в том, что вы не хотите писать эту вещь вручную. Просто создайте еще один script, который выведет тело этой функции (все между скобками сглаживания) как * my_bind_param_body.php *. Затем просто определите заголовок функции в вашем основном файле и включите тело в это определение функции. то есть.

function my_bind_param(&$stmt, $types, &$arg1, &$arg2 = null, &$arg3 = null, . )

Источник

Функция PHP с неограниченным количеством параметров

Как написать функцию, которая может принимать неограниченное количество параметров?

То, что я пытаюсь сделать, это создать функцию внутри класса, которая включает следующее:

$stmt->bind_param('sssd', $code, $language, $official, $percent); 

Вышеприведенные предложения все хороши, но я не думаю, что они будут подходящими для вашей ситуации.

$stmt->bind_param('sssd', $code, $language, $official, $percent); 

Если вы хотите обернуть эту функцию, вам нужно будет передать ссылки на исходные переменные аргумента функции bind_param. Я не думаю, что func_get_args () дает вам это, он дает вам значения. Таким образом, невозможно будет использовать их для перехода к родительской функции. Я сражался с подобной проблемой, пытаясь расширить mysqli_stmt и никогда не получал удовлетворительного решения.

На самом деле это не ответ на ваш вопрос, я боюсь, просто предупреждение о том, что другие аргументы могут не работать в вашем конкретном приложении произвольного количества аргументов.

Вы взглянули на func_get_args , func_get_arg и func_num_args

function bind_param() < if ( func_num_args() $format = func_get_arg(0) $args = array_slice(func_get_args(), 1) //etc > 

РЕДАКТИРОВАТЬ
Относительно комментария Эвана Тодса:
У меня нет каких-либо знаний базового API, для которого вы создаете оболочку, но другой альтернативой может быть что-то сделать с функциями цепочки, чтобы ваш получившийся интерфейс выглядел примерно так:

$var->bind()->bindString($code) ->bindString($language) ->bindString($official) ->bindDecimal($percent); 

Который я бы предпочел использовать func_get_args, поскольку код, вероятно, более читабельен и, что более важно, менее вероятно, приведет к ошибкам из-за отсутствия переменной формата.

Раньше вы должны были использовать func_get_args() , но в php 5.6 вы можете использовать … оператор .

Так, например, вы можете написать функцию, которая возвращает вам сумму всех чисел, отправленных функции:

function bind_param(. $params)

Ваши params на самом деле являются массивом всех элементов.

При 5 параметрах эта конструкция начинает демонстрировать AntiPattern « Слишком много параметров ». Это предполагает рефакторинг, называемый Parameter Object , объект или структуру с элементами данных, представляющими аргументы, которые должны быть переданы. Однако избегайте превращать его в Magic Container .

См. Также Введение рефакторинга объектов параметров на сайте refactoring.com.

Если вы используете PHP 5.6 или более позднюю версию, списки аргументов могут включать . токен, чтобы обозначить, что функция принимает переменное количество аргументов. Аргументы будут переданы в заданную переменную в виде массива; Просто используя . вы можете получить доступ к неограниченным переменным аргументам.

 return $sum ; > echo sum(1, 2, 3, 4, 5); ?> 
= 2) < echo "Second argument is: " . func_get_arg(1) . "\n"; >$arg_list = func_get_args(); for ($i = 0; $i < $numargs; $i++) < echo "Argument $i is: " . $arg_list[$i] . "\n"; >> foo(1, 2, 3); ?> 

Существует функция func_get_args (), которая представляет собой массив всех аргументов, переданных функции.

function foo() < $numargs = func_num_args(); echo "Number of arguments: $numargs
\n"; if ($numargs >= 2) < echo "Second argument is: " . func_get_arg(1) . "
\n"; > $arg_list = func_get_args(); for ($i = 0; $i < $numargs; $i++) < echo "Argument $i is: " . $arg_list[$i] . "
\n"; > > foo(1, 2, 3);

Вышеприведенный пример выводит:

Количество аргументов: 3
Второй аргумент: 2
Аргумент 0: 1
Аргумент 1: 2
Аргумент 2: 3

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

Что вы можете сделать, это определить функцию, которая принимает большое количество аргументов и по умолчанию имеет значение null. Затем внутри этой функции добавьте каждую ненулевую ссылку на массив, который затем будет использоваться для вызова * bind_param () *, используя * call_user_func_array () *.

function my_bind_param(&$stmt, $types, &$arg1, &$arg2 = null, &$arg3 = null, . ) < $vars = array($types); $vars[] = $arg1; if ($arg2 != null) $vars[] = &$arg2; if ($arg3 != null) $vars[] = &$arg3; . if (!call_user_func_array(array($stmt, "bind_param"), $vars)) < if ($stmt->errno == 0) return array(-1, "Unknown error binding parameters."); else return array(-1, "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error); > return array(0, ""); > 

Настоящий трюк заключается в том, что вы не хотите писать эту штуку вручную. Просто создайте еще один скрипт, который выведет тело этой функции (все между скобками сглаживания) как * my_bind_param_body.php *. Затем просто определите заголовок функции в вашем основном файле и включите тело в это определение функции. т.е.

function my_bind_param(&$stmt, $types, &$arg1, &$arg2 = null, &$arg3 = null, . )
  • Передача нескольких аргументов функции обратного вызова (с использованием PHP 5.2)
  • Как преобразовать список параметров функции PHP в ассоциативный массив?
  • Обходной путь для базового синтаксиса, который не анализируется
  • Использование аргументов по умолчанию в функции
  • Может ли функция PHP принимать неограниченное количество параметров?
  • Что такое использование одной трубы? ‘ В аргументе функции Do?
  • Sylius: Как вводить (запрашивать) аргументы в пользовательском ProductRepository?
  • Переслать неопределенное количество аргументов в другую функцию
  • Функция вызова spl_autoload_register с параметрами
  • PHP: Получить аргументы метода?
  • Неограниченные аргументы для функции PHP?
  • Аргументы PHP-класса в функциях

Источник

Php неограниченное количество аргументов

В этом разделе помещены уроки по PHP скриптам, которые Вы сможете использовать на своих ресурсах.

Фильтрация данных с помощью zend-filter

Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Контекстное экранирование с помощью zend-escaper

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Подключение Zend модулей к Expressive

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Совет: отправка информации в Google Analytics через API

Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

Подборка PHP песочниц

Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

Совет: активация отображения всех ошибок в PHP

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

Источник

Читайте также:  Javascript link href css
Оцените статью