php function parameter function

Принимать функцию в качестве параметра в PHP

мне было интересно, можно ли передать функцию в качестве параметра в PHP; я хочу что-то вроде того, когда вы программируете в JS:

Я хочу, чтобы выполнить эту функцию где-то в exampleMethod. Это возможно в PHP?

8 ответов:

это возможно, если вы используете PHP 5.3.0 или выше.

посмотреть Анонимные Функции в руководстве.

в вашем случае, можно определить exampleMethod такой:

просто, чтобы добавить к другим, вы можете передать имя функции:

Это будет работать в PHP4.

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

было бы здорово, если бы вы могли изобрести что-то вроде этого (вдохновленный Laravel Illuminate):

согласно ответу @zombat, лучше сначала проверить анонимные функции:

или проверить тип аргумента начиная с PHP 5.4.0:

простой пример использования класса :

Пример 1: basic

Пример 2: std object

Пример 3: нестатический вызов класса

Пример 4: вызов статического класса

как я вижу здесь, анонимная функция может помочь вам: http://php.net/manual/en/functions.anonymous.php

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

в функция для проверки:

затем, чтобы вызвать его, используйте этот фрагмент кода (если вам также нужны параметры, поместите их в массив), видимый по адресу:http://php.net/manual/en/function.call-user-func.php

как это следует (аналогичным, без параметров, способом):

вот класс, объясняющий, как сделать что-то подобное :

Источник

Php function parameter function

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 pass function name as param then call the function?

I need to pass a function as a parameter to another function and then call the passed function from within the function. This is probably easier for me to explain in code..I basically want to do something like this:

Is there a way to do that.. I am using PHP 4.3.9

7 Answers 7

An example from the PHP Manual:

In php this is very simple.

Additionally, you can do it this way. See variable functions.

php function parameter function. Смотреть фото php function parameter function. Смотреть картинку php function parameter function. Картинка про php function parameter function. Фото php function parameter function

php function parameter function. Смотреть фото php function parameter function. Смотреть картинку php function parameter function. Картинка про php function parameter function. Фото php function parameter function

I know the original question asked about PHP 4.3, but now it’s a few years later and I just wanted to advocate for my preferred way to do this in PHP 5.3 or higher.

PHP 5.3+ now includes support for anonymous functions (closures), so you can use some standard functional programming techniques, as in languages like JavaScript and Ruby (with a few caveats). Rewriting the call_user_func example above in «closure style» would look like this, which I find more elegant:

This could be done with call_user_func, of course, but I find this syntax much clearer, especially once namespaces and member variables get involved.

One caveat: I’ll be the first to admit I don’t know exactly what’s going on here, but you can’t always call a closure contained in a member or static variable, and possibly in some other cases. But reassigning it to a local variable will allow it to be invoked. So, for example, this will give you an error:

But this simple workaround fixes the issue:

Источник

Функции в PHP

php function parameter function. Смотреть фото php function parameter function. Смотреть картинку php function parameter function. Картинка про php function parameter function. Фото php function parameter function

Всем привет! В этом уроке мы познакомимся с таким понятием как функции в языке PHP. Функции – вещь довольно простая. Она представляет собой кусок кода, который принимает определенные параметры и на выходе возвращает какой-либо результат. Можно написать функцию один раз, а затем использовать её в различных местах. Таким образом вам не нужно будет дублировать код, если что-то нужно сделать дважды, или трижды, или сколько угодно раз. Вообще, функции в PHP можно сравнить с функциями в математике.

В PHP изначально содержится огромное число встроенных функций. Это очень сильная сторона этого языка – почти под любую вашу потребность имеется уже готовая функция. Давайте попробуем несколько функций на практике.

Например, нам нужен косинус числа 3.14. Легко! Для этого в PHP есть функция cos.

Есть очень много функций для работы со строками. Например, можно в строке заменить одни символы другими, для этого есть функция str_replace. Например, давайте в строке “abracadabra” заменим все буквы “a” на “o”.

php function parameter function. Смотреть фото php function parameter function. Смотреть картинку php function parameter function. Картинка про php function parameter function. Фото php function parameter function

Вообще, гуглить и брать уже готовый код – это хороший подход, который экономит ваше время. В этом нет ничего плохого – скорее всего вы найдёте лучшее решение задачи, чем то, которое бы написали сами. Научитесь на готовых примерах, а со временем запомните наиболее частые подходы для разных случаев. Здесь главное – постоянная практика.

Пользовательские функции: пишем свою первую функцию

Думаю, о том, что такое функции и где найти уже готовые, я объяснил. Но самое крутое то, что функции можно определять самому! В целом определение любой функции выглядит следующим образом:

Давайте рассмотрим пример создания простейшей функции в PHP. Пусть она принимает на вход два числа и возвращает их сумму.

Окей, функцию написали, теперь можно её вызвать и посмотреть на результат её работы.

Как мы видим, функция успешно отработала. Вот так, написав её лишь один раз мы можем передавать в неё разные аргументы, и получать разные значения. Использовать функцию можно только после кода её определения!

Области видимости

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

Данный код абсолютно рабочий. Здесь переменные $x и $y внутри функции getSum живут сами по себе, а переменные с такими же именами за пределами функции – отдельно, и они ничего друг о друге не знают. При вызове функции значение передаваемого аргумента будет скопировано в локальную переменную, а после выхода из функции это значение будет удалено. То есть здесь при вызове getSum мы просто копируем значения 3 и 5 в локальные переменные $x и $y. С этого момента внутри функции внешние переменные перестают существовать, и она знает только о своих переменных.

Параметры функции: передача аргументов по ссылке и по значению

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

Передача параметров по ссылке

Однако можно передать аргумент по ссылке. Делается это при помощи знака & перед именем аргумента.

При этом не происходит копирования значения в локальную переменную. Появляется ещё одна связь для этого же значения, но с другим именем. И теперь, изменяя значение этой переменной внутри функции, мы будем изменять исходное, переданное значение. Давайте рассмотрим пример передачи значения по ссылке.

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

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

Начинаем использовать тайп-хинтинг (type hinting) в PHP 7

В PHP 7 в функциях появилась возможность указывать типы аргументов, в том числе для скалярных типов (строки, числа). При этом при передаче аргумента в функцию, передаваемое значение будет автоматически приведено к нужному типу. Давайте перепишем нашу функцию, учитывая современные возможности PHP 7.

Вот так, теперь при передаче любых значений в функцию, они автоматически будут приведены к числам. Давайте это проверим – вставим вызов функции var_dump внутри нашей функции, и посмотрим, что получится.

Вполне ожидаемо, скажете вы. Мы ведь передали в функцию целые числа, и даже если бы у аргументов не было приведения типов, то там точно так же были бы целые числа. И будете правы. Но давайте попробуем в качестве одного из аргументов передать число с плавающей запятой.

После выполнения мы увидим следующее:

То есть в тот момент, когда аргумент пришёл в функцию, он был уже нужного типа. Давайте попробуем убрать указание типа из аргумента:

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

В этом курсе мы всегда будем использовать указание типов. Это помогает писать более строгий код и позволяет допускать меньше ошибок. Посудите сами – если мы работаем с конкретным типом, мы более уверены в том, как будет работать тот или иной код.

Строгая типизация

Как я уже сказал, по умолчанию значение аргумента будет автоматически приведено к указанному типу. Однако в PHP есть возможность указать явно, что аргумент, передаваемый в функцию, будет иметь конкретный тип. Это делается с помощью директивы:

Она указывается в начале PHP-файла. Наш код примет следующий вид:

При этом, если его сейчас запустить, то произойдёт ошибка с типом TypeError.
php function parameter function. Смотреть фото php function parameter function. Смотреть картинку php function parameter function. Картинка про php function parameter function. Фото php function parameter function

Как тут написано, первый аргумент, переданный в getSum() обязан быть типа integer, а передан с типом float. Это и есть строгая типизация в PHP. Использовать её в рамках данного курса мы не будем, да и в профессиональной разработке на PHP этот функционал пока не используют. Но не рассказать о ней я не мог, вполне возможно, что это могут спросить при собеседовании на работу. А сейчас убираем строку declare(strict_types=1); из нашего кода и идём дальше.

Функции без аргументов

Как я говорил, функция может вообще не иметь аргументов. Таковой, например, является стандартная функция rand() – она просто возвращает случайное число.

Давайте её попробуем в действии:

Давайте запустим ещё раз этот же самый код:

Работает. А давайте теперь напишем свою функцию, которая тоже не принимает аргументов, и возвращает синус случайного числа:

Функция внутри функции

Давайте теперь рассмотрим, что ещё позволяют нам делать функции. Функции в PHP можно вызывать внутри других функций. Давайте приведём абсолютно простейший пример. Например, нам нужно найти сумму косинусов двух чисел. Напишем для этого функцию:

Здесь мы использовали функцию cos() из стандартной библиотеки внутри нашей собственной функции. А можно ли вызывать свои же функции из других своих функций? Да легко!

Здесь мы определили 2 разные функции, и во второй начали использовать первую. Разумеется, эти примеры довольно искусственны. И вы можете подумать, что использовать здесь функции излишне. Ведь можно же просто заменить этот код следующим выражением:

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

Код данной функции можно упростить, так как если $x не больше $y, то мы в любом случае вернём $y. Поэтому можно убрать блок else:

Результат будет таким же. Так происходит, как я уже говорил, что как только в функции выполнится return, значение будет тут же возвращено, а функция завершит свою работу.

Давайте передадим первым аргументом большее число:

Рекурсивные функции

php function parameter function. Смотреть фото php function parameter function. Смотреть картинку php function parameter function. Картинка про php function parameter function. Фото php function parameter function

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

Например, нам нужно возвести число в степень. Предположим, у нас для этого есть определённая функция. Назовём её power. И пусть она принимает 2 аргумента:

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

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

Тогда для возведения 2 в степень 3 получим:

Число в первой степени равно самому этому числу. Здесь нам нужно остановиться.

Давайте реализуем это с помощью кода:

Вывод получится следующим:

Таким образом, мы видим, что функция была вызвана трижды, и мы видим, какими были значения аргументов на каждом вызове. Надеюсь, тут всё понятно. Если же нет (а при изучении рекурсии это происходит довольно часто) – пишите ваши вопросы в комментариях, помогу. А ещё можете пошагово разбирать ход программы на листочке – тоже часто помогает.

Давайте для закрепления разберём ещё один пример с рекурсией. Например, мы будем передавать в функцию какое-то число $n, а она будет считать сумму всех чисел от единицы до этого числа. Назовём эту функцию getSumOfNumbersFromZero($n).

Предположим, нам нужно посчитать сумму всех чисел от 1 до 5. Тогда вызов функции будет следующим:

Как можно догадаться, этот вызов можно представить как

Или в общем случае

И так до тех пор, пока $n не станет равен 1.

Давайте реализуем это с помощью рекурсивной функции:

Всё верно! Ну, хватит рекурсии, а то я уже слышу, как у вас закипают мозги.
Очень надеюсь, что вам понравился урок. Если это так – буду рад, если вы поделитесь им в социальных сетях или расскажете друзьям. Это лучшая поддержка проекта. Спасибо тем, кто это делает. Если у вас возникли какие-то вопросы или замечания – напишите об этом в комментариях. А сейчас – делаем домашнее задание, варианты ваших решений можете писать в комментариях, я их проверю и скажу, всё ли правильно. Всем пока!

Источник

PHP Function with Optional Parameters

I’ve written a PHP function that can accept 10 parameters, but only 2 are required. Sometimes, I want to define the eighth parameter, but I don’t want to type in empty strings for each of the parameters until I reach the eighth.

One idea I had was to pass an abstracted function with an array of parameters which passes it along to the real function.

Is there a better way to set up the function so I can pass in only the parameters I want?

php function parameter function. Смотреть фото php function parameter function. Смотреть картинку php function parameter function. Картинка про php function parameter function. Фото php function parameter function

15 Answers 15

What I have done in this case is pass an array, where the key is the parameter name, and the value is the value.

Make the function take one parameter: an array. Pass in the actual parameters as values in the array.

To accomplish what you want, use an array Like Rabbot said (though this can become a pain to document/maintain if used excessively). Or just use the traditional optional args.

php function parameter function. Смотреть фото php function parameter function. Смотреть картинку php function parameter function. Картинка про php function parameter function. Фото php function parameter function

You can just set the default value to null.

php function parameter function. Смотреть фото php function parameter function. Смотреть картинку php function parameter function. Картинка про php function parameter function. Фото php function parameter function

The above example will output:

php function parameter function. Смотреть фото php function parameter function. Смотреть картинку php function parameter function. Картинка про php function parameter function. Фото php function parameter function

NOTE: This is an old answer, for PHP 5.5 and below. PHP 5.6+ supports default arguments

In PHP 5.5 and below, you can achieve this by using one of these 2 methods:

How to use

I prefer the second method because it’s clean and easy to understand, but sometimes you may need the first method.

php function parameter function. Смотреть фото php function parameter function. Смотреть картинку php function parameter function. Картинка про php function parameter function. Фото php function parameter function

I think, you can use objects as params-transportes, too.

Of course, you have to set default values for «optParam8» and «optParam2» in this function, in other case you will get «Notice: Undefined property: stdClass::$optParam2»

If using arrays as function parameters, I like this way to set default values:

If only two values are required to create the object with a valid state, you could simply remove all the other optional arguments and provide setters for them (unless you dont want them to changed at runtime). Then just instantiate the object with the two required arguments and set the others as needed through the setter.

php function parameter function. Смотреть фото php function parameter function. Смотреть картинку php function parameter function. Картинка про php function parameter function. Фото php function parameter function

I know this is an old post, but i was having a problem like the OP and this is what i came up with.

Example of array you could pass. You could re order this if a particular order was required, but for this question this will do what is asked.

This is manageable, easy to read and the data extraction points can be added and removed at a moments notice anywhere in coding and still avoid a massive rewrite. I used integer keys to tally with the OP original question but string keys could be used just as easily. In fact for readability I would advise it.

Stick this in an external file for ease

put this at the start if the file.

Just use these to assign the next piece of data use numbering/naming according to where the data is coming from.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *