2010-06-05 3 views
2

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

Кулак пример (вот что я понимаю :)):

$func = function($str){ return $str; }; 
$func2 = function($str){ return $str; }; 
$var = $func($func2('asd')); 

var_dump($var); 
// prints out string(3) "asd" 

Это имеет смысл для меня, но то, что со следующей одной?

$func = function($str){ return $str; }; 
$var = $func(function($str = "asd"){ return $str; }); 

var_dump($var); 

/** This prints out: 
object(Closure)#1 (1) { 
    ["parameter"]=> 
    array(1) { 
    ["$str"]=> 
    string(10) "" 
    } 
} 
But why? 
*/ 

И в конце концов, кто-то может порекомендовать мне книгу или статью, от того, что я могу научиться этому лямбда функцию РНР кодирования?

ответ

6

$func просто возвращает свой аргумент, так:

$var = $func(function($str = "asd"){ return $str; }); 

так же, как:

$var = function($str = "asd"){ return $str; }; 

Тот факт, что анонимные функции являются экземплярами Closure является деталью реализации the docs предостерегают от опираясь на. Нет ничего особенного в Closure. Он может быть реализован в регулярном PHP благодаря магическому методу __invoke.

На моей установке PHP 5.3.2 Closure имеет другое представление. Параметр помечен строкой "<optional>". Возможно, это проблема форматирования.

php > $func = function($str){ return $str; }; 
php > $var = function($str = "asd"){ return $str; }; 
php > var_dump($var); 
object(Closure)#2 (1) { 
    ["parameter"]=> 
    array(1) { 
    ["$str"]=> 
    string(10) "<optional>" 
    } 
} 
+0

Спасибо, это было очень полезно, чтобы понять, что я делаю :) –

2

Во втором примере $ FUNC просто возвращает функцию, заданную параметрами ..

Самый простой способ, чтобы показать вам этот путь ..

$func = function($str){ return $str(); }; 
$var = $func(function($str = "asd"){ return $str; }); 

var_dump($var); 

Обратите внимание на() после «возвращения $ ул»в $ FUNC

Ответить на комментарий:

$func = function($str, $value){ return $str($value); }; 
$var = $func(function($str = "asd"){ return $str; }, 'efg'); 

var_dump($var); 
+0

Понимаете? Функция не возвращается. Таким образом,() после $ str wil выполнит его. – Phliplip

+0

yep, я понял, и как можно добавить значение к переменной $ str в неименованном параметре, функции? –

+0

На мой ответ на ваш ответ в ответе – Phliplip

0
$func = function($str){ return $str; }; 

Создает объект Closure с __invoke() функции.

Этот объект передается как параметр во втором примере. И поскольку функция anonimimus возвращает вход, var_dump() отображает объект функции вместо результат.

Слишком плохо сцепление не поддерживается (как в JavaScript)

$func = function($str){ return $str; }; 
$var = $func(function($str = "asd"){ return $str; }('test')); 
var_dump($var); 

Может привести к "тест" но генерирует ошибку PHP Синтаксическая: ошибка синтаксиса, неожиданный '('

2
$func = function($str){ return $str; }; 
$var = $func(function($str = "asd"){ return $str; }); 

var_dump($var); 

Сначала вы определяете функцию $func, которая просто возвращает первый параметр. Таким образом, $ var становится function($str = "asd"){ return $str; }.

Я могу порекомендовать статью IBM о замыканиях и лямбда-функциях http://www.ibm.com/developerworks/opensource/library/os-php-5.3new2/index.html.

Смежные вопросы