php необязательные параметры функции
Функции
Объявление и вызов функции
Функция может возвращать значение. Для этого необходимо использовать конструкция return:
Продемонстрируем пример, где функция вычисляет сумму двух чисел:
В данном примере функция не принимает ни одного аргумента, а просто вычисляет сумму и возвращает полученный результат. После этого она вызывается в теле конструкции Echo для вывода результата в браузер. Можно изменить функцию так, чтобы вывод осуществлялся исключительно в теле функции, для этого необходимо конструкцию return изменить на echo. Однако такой подход обычно не приветствуется, то есть сильно сужает область применения функции, поскольку возвращаемую строку не можно будет передать далее для обработки другим функциям.
Функция может вызываться до ее объявления, за исключением тех случаев, если объявление функции осуществляется в зависимости от условия внутри фигурных скобок. В этом случае попытка вызова функции, объявленной условно, раньше объявления приводит к генерации ошибки: «Fatal error: Uncaught Error: Call to undefined function«.
Параметры и аргументы функции
Типы параметров и возвращаемого значения
Передача параметров по значению и ссылке
Необязательные параметры
Переменное количество параметров
Глобальные переменные
Статические переменные
Поскольку локальные переменные имеют своей областью видимости функцию, то время жизни локальной переменной определяется временем выполнения функции, в которой она объявлена. Это означает, что в разных функциях совершенно независимо друг от друга могут использоваться переменные с одинаковыми именами. Локальная переменная при каждом вызове функции инициализируется заново, поэтому функция-счетчик, пример которой показан в примере, всегда будет возвращать значение 1:
Для того чтобы локальная переменная сохраняла свое предыдущее значение при новых вызовах функции, ее можно объявить статической при помощи ключевого слова static:
В примере, переменная $counter устанавливается в ноль при первом вызове функции, и при последующих вызовах функция будет знать, каким было значение переменной при предыдущих вызовах.
Временем жизни статических и глобальных переменных является время выполнения сценария. То есть если пользователь перезагружает страницу, что приводит к новому выполнению сценария, переменная $counter инициализируется заново.
Возврат массива функцией
Рекурсивные функции
Практически в любом случае можно избежать рекурсивных функций. Исключение составляют задачи, так или иначе связанные с обходом деревьев. К таким задачам относится, например, удаление каталогов, когда число файлов и подкаталогов заранее не известно, и необходимо вызывать функцию удаления до тех пор, пока не будут удалены файлы на самом глубоком уровне вложенности.
В РНР возможно объявлять функции внутри другой функции. В отличие от обычных функций, вложенная функция не может использоваться до тех пор, пока не будет осуществлен вызов основной функции, который произведет объявление вложенной.
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 foo:
есть ли способ указать только второй необязательный параметр?
12 ответов
PHP не поддерживает именованные параметры для функций как таковых. Тем не менее, есть несколько способов обойти это:
вариант метода массива, который позволяет упростить настройку значений по умолчанию:
вы могли бы немного рефакторинг кода:
Если у вас есть несколько необязательных параметров, одно решение-передать один параметр, который является хэш-массивом:
конечно, в этом решении нет никакой проверки, что поля хэш-массива или правильно. Все зависит от тебя.
нет. Обычный способ сделать это-с некоторыми эвристиками, чтобы определить, какой параметр подразумевался, например, длина строки, типирование и т. д.
вообще говоря, вы бы написали функцию, чтобы взять параметры в порядке наиболее необходимого для наименее необходимого.
вы можете использовать специальную метку, например NULL, чтобы отметить, что значение не указано:
есть несколько реализаций стиля «options», упомянутых здесь. До сих пор ни один из них не является очень пуленепробиваемым, если вы планируете использовать их в качестве стандарта. Попробуйте этот шаблон:
аргументы должны быть переданы в положение, вы не можете пропустить параметр как таковой; вам нужно будет указать значение параметра по умолчанию, чтобы пропустить его. Возможно, это разрушает цель того, чего вы пытаетесь достичь.
не переписывая свою функцию, чтобы принимать параметры по-разному, вот способ обойти это:
другими словами, вы используете отражение для проверки параметров функции и сопоставления их с доступные параметры по имени, пропуская необязательные параметры со значением по умолчанию. Да, это некрасиво и громоздко. Вы можете использовать этот образец для создания функции как:
Я хотел бы, чтобы это решение было включено, когда я начал использовать PHP 2.5 лет назад. Он отлично работает в примерах, которые я создал, и я не вижу, почему он не должен быть полностью расширяемым. Он предлагает следующие преимущества по сравнению с ранее предложенными:
(i) весь доступ к параметрам внутри функции осуществляется именованными переменными, как если бы параметры были полностью объявлены, а не требовали доступа к массиву
(ii) очень быстро и легко приспособиться существовать функции
(iii) для любой функции требуется только одна строка дополнительного кода (в дополнение к неизбежной необходимости определения параметров по умолчанию, которые вы все равно будете делать в сигнатуре функции, но вместо этого вы определяете их в массиве). Кредит на дополнительную линию полностью принадлежит Биллу Карвину. Эта линия идентична для каждой функции.
определите свою функцию с ее обязательными параметрами и необязательным массив
объявите необязательные параметры как локальные переменные
суть: замените предварительно объявленное значение по умолчанию любых дополнительных параметров, используя те, которые вы передали через массив.
вызовите функцию, передав ее обязательные параметры, и только те необязательные параметры, которые вам требуются
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
В мире программирования и сценариев существует два способа писать код. Первый из них — это написать длинные и монолитные разделы сценария. Другой — разбить код на аккуратные, автономные блоки, которые можно использовать повторно, не изобретая один и тот же код снова и снова. Очевидно, что второй метод предпочтительнее первого, а фундаментальным строительным блоком этого подхода к написанию сценариев PHP является функция.
Функция — это именованный блок кода, который может быть вызван из любого другого участка кода для выполнения определенной задачи. Значения (аргументы) могут быть переданы в функцию, чтобы их можно было использовать в сценарии функции, а функция, в свою очередь, может возвращать результаты в то место сценария, из которого она была вызвана.
Функции в PHP существуют в двух формах:
Создание пользовательской функции PHP
Первым шагом в создании функции PHP является указание имени, по которому вы будете ссылаться на функцию. В соответствии с соглашением об именах для функций PHP, они должны начинаться с буквы или подчеркивания и не должны содержать каких-либо пробелов или знаков препинания. Важно также предусмотреть, чтобы имя вашей функции не конфликтовало ни с одной из встроенных функций PHP.
Примечание: Имена функций не чувствительны к регистру букв.
Пример
Результат выполнения кода:
Параметры функции PHP
Пример
Результат выполнения кода:
Пример
Результат выполнения кода:
Передача параметров в функцию по ссылке
По умолчанию параметры функции передаются по значению, поэтому, если значение аргумента внутри функции изменяется, оно не затрагивается вне функции. Если нужно позволить функции изменять значения параметров, последние должны быть переданы по ссылке.
Передача параметров по ссылке выполняется добавлением амперсанда (&) к имени параметра в определении функции, как показано в примере ниже:
Пример
Результат выполнения кода:
Значения по умолчанию для параметров функции
Функции могут определять значения аргументов по умолчанию. Чтобы установить значение по умолчанию просто вставьте имя параметра, затем знак равенства (=) и значение по умолчанию:
Пример
Результат выполнения кода:
Примечание: Все параметры, для которых установлены значения по умолчанию, должны находиться правее параметров, для которых значения по умолчанию не заданы. В противном случае ваш код выдаст ошибку.
Возврат значения из функции PHP
В следующем примере возвращаемое функцией значение присваивается переменной:
Пример
Результат выполнения кода:
Функция не может возвращать несколько значений. Но мы можем получить несколько результатов, возвращая массив, как показано в следующем примере:
Пример
Результат выполнения кода:
Строгая типизация
Обратите внимание, что в приведенном выше примере мы не указывали PHP-интерпретатору, к какому типу данных принадлежит переменная.
PHP — это слабо типизированный язык и он автоматически связывает тип данных с переменной в зависимости от ее значения. Благодаря этой особенности, мы можем добавлять строки к целому числу, не вызывая ошибки.
В следующем примере функция получает параметры как число, так и строку, не используя strict :
Пример
Результат выполнения кода:
Пример
Результат выполнения кода будет примерно такой:
В этом примере мы передаём функции в качестве аргументов как число, так и строку, но здесь мы добавили строгий ррежим strict и получили фатальную ошибку.
Объявления типа возвращаемого значения
Чтобы объявить режима строгой типизации для возвращаемого значения функции, добавьте двоеточие (:) и тип прямо перед открывающей фигурной скобкой < при объявлении функции.
Пример
Результат выполнения кода:
Укажем тип возвращаемого значения, отличный от типов аргументов, и убедимся, что тип возвращаемого значения функции является правильным: