Когда у закрытий есть параметры (или как работают замыкания с параметрами)? Я знаю, что use()
используется для импорт переменных вне анонимной функции, но как насчет параметров (-ов) самого закрытия?Откуда вы знаете, какие параметры/аргументы нужно положить в закрытие?
ответ
Пример колпачков с параметрами выделка:
function greeter($greeting)
{
return function($whom) use ($greeting) {
// greeting is the closed over variable
return "$greeting $whom";
};
}
$hello_greeter = greeter('hello');
echo $hello_greeter('world'); // will print 'hello world';
greeter
функция возвращает «наполовину реализованы» функцию, которая всегда будет начинаться с тем же приветствием, а затем все, что передается в него (например, человек приветствовать).
Это связано с PHP, а не с Javascript ... –
@JaredFarrish все в порядке, это не так уж и много, хотя :) –
Знаете ли вы это точно? –
Если вы используете функцию, которая принимает анонимную функцию как параметр, то проверьте документ функции.
Если функция написана вами, то вы являетесь контроллером, вы ее решаете.
Я больше знаком с закрытием Javascript, но для решения вопроса «почему и когда у вас есть аргументы в закрытии?», Я бы сказал, когда вы либо сопоставляете входящую подпись (например, в обработчике), либо более удобно или полезно передавать в качестве аргументов. Комментарии? –
@JaredFarrish Закрытие PHP - это мусор, отличный от javascript. Когда вы используете переменную снаружи, вам нужно использовать 'use'. – xdazz
Да, я читаю руководство [Using namespaces: Aliasing/Importing] (http://php.net/manual/en/language.namespaces.importing.php), и я понимаю, что мне нужно прочитать об этом. Не то же самое, что и Javascript. –
Завершения, переданные функциям PHP, которые должны иметь параметры, подробно описаны в документах. Хорошим примером этого является array_walk()
, который используется, чтобы применить функцию обратного вызова для итератора:
$arr = array('a', 'b', 'c');
array_walk($arr, function($key, $val) {
echo $key . ' => ' . $val . "\n";
});
в документации, параметры, которые вы должны включить на вызываемая передается array_walk()
детализированы в разделе «Параметры». В нем говорится:
Как правило, funcname принимает два параметра. Значение параметра массива является первым, а ключ/индекс вторым.
Часто вы найдете похожие советы по другим функциям в документах PHP. Я был разочарован тем, что документация для array_map()
была не такой детализированной, но я помню, что существуют другие функции, которые исключали вызывающие вызовы, которые имели достаточную документацию о параметрах закрытия.
Если вы хотите, чтобы написать свою собственную функцию, которая принимает замыкания (или другие значения, которые вы можете позвонить) и диктует, какие параметры он должен иметь, вы можете использовать typehint callback
в PHP 5.3 или callable
в PHP 5.4 ,
function gobblesUpCallable(callable $func) {
call_user_func($func); // Use this, someone could pass in a callable string or array
}
Однако, чтобы определить параметры, вам нужно использовать ReflectionClass
или ReflectionFunction
означает, что вы, вероятно, отказаться от call_user_func()
.
Я бы не назвал это закрытием, хотя он ничего не закрывает; скорее, это анонимная функция .. опять же, термин «закрытие» в PHP неоднозначен :) –
@PhpMyCoder 'Только переменные могут передаваться по ссылке – Michelle
@Jack - ссылка на Руководство для [анонимных функций] (http://www.php.net/manual/en/functions.anonymous.php), первый пример идентичен приведенному здесь, за исключением того, что он использует другую функцию. Что не так с этим примером? –
use()
особенно полезен для функций, для которых требуется функция в качестве параметра. Может потребоваться, чтобы переданная функция принимала только два параметра и что любой дополнительный параметр просто игнорируется. В этом случае используйте «use()
» для «импорта» переменной из текущей области в функцию анона.
$myvar = 10;
$fun = function(&$val, $index) use ($myvar) {$val += $myvar;};
$testArray = array(1,2,3);
array_walk($testArray, $fun);
var_dump($testArray); // 11, 12, 13
Примечание: если ваша функция Анон подпись была function(&$val, $index, $myvar)
вместо этого, вы получите постоянный warnings
при использовании функции Анон с array_walk
, потому что дополнительный третий параметр не используется и не определено. Итак, используйте use()
, чтобы передать этот дополнительный параметр.
Редактировать: вы также можете передать переменные по ссылке use()
...
$myvar = 10;
$fun = function(&$val, $index) use (&$myvar) {$myvar = 1; $val += $myvar;};
$testArray = array(1,2,3);
array_walk($testArray, $fun);
var_dump($testArray); // 2, 3, 4
echo $myvar; // 1
- 1. Откуда вы знаете, какие функции в R отмечены для отладки?
- 2. Откуда вы знаете, какие поля находятся в модели Laravel?
- 3. Откуда вы знаете, когда нужно закрыть файл в python?
- 4. Откуда вы знаете, какие методы использовать для задачи?
- 5. Откуда вы знаете, какие параметры следует задать для функции javascript?
- 6. Откуда вы знаете, когда использовать шаблоны дизайна?
- 7. Откуда вы знаете местоположение в пикселях
- 8. Откуда вы знаете, какое отношение использовать?
- 9. Откуда вы знаете, когда закрыть проект?
- 10. Откуда вы знаете, что такое хороший индекс?
- 11. Откуда вы знаете, кто зависит от проекта?
- 12. Откуда вы знаете, когда скрипт PowerShell закончен?
- 13. Константы. Откуда вы знаете, что такое константа?
- 14. Откуда вы знаете, доверено ли CA?
- 15. Откуда вы знаете, если документ готов
- 16. Какие инъекции SQL вы знаете?
- 17. Откуда вы знаете, что вы «внутри» набора треугольников?
- 18. Откуда вы знаете, когда переменная/свойство было закрыто?
- 19. Какие сайты онлайн-знакомств вы знаете?
- 20. Откуда вы знаете, какую ОС использовать при размещении приложений Coldfusion?
- 21. Откуда вы знаете, что было загружено в среду REPL clojure?
- 22. Откуда вы знаете, когда бросать элемент в swift?
- 23. Откуда вы знаете, если ваш список возрастает в python
- 24. Откуда вы знаете, где выполнять вращения в дереве AVL?
- 25. Откуда вы знаете значение параметра в этой функции javascript?
- 26. Откуда вы знаете, есть ли в UWP-устройстве Чат/SMS?
- 27. Откуда вы знаете, какой код Node.js будет запущен в браузере?
- 28. Откуда вы знаете, какая кодировка пользователя вводит в браузер?
- 29. Откуда вы знаете, проект проекта maven в eclipse?
- 30. iOS - Откуда вы знаете, что устройство что-то играет?
Вы, безусловно, получаете свои деньги из слова * use *. ';)' –
@JaredFarrish 'use' предназначен для переменной импорта для области анонимной функции. Сокет, подобный '$ fuc = function ($ a, $ b), используется ($ c) {}'. – xdazz
Обратите внимание, что ссылка (как указано выше @xdazz) была неправильной; ссылку [Анонимные функции] (http://www.php.net/manual/en/functions.anonymous.php). –