2015-04-04 3 views
2

Неправильно ли это использовать?Использовать() заявление об анонимных функциях

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

Вот как это выглядит

$a = 1; 
$func = function() use($a){ 
    print $a; 
}; 
+0

Нет это не является плохим практика, на самом деле это почти необходимо для обратных вызовов из array_walk()/usort() и т. д., у которых есть фиксированные аргументы, и вам нужны дополнительные значения, которые подаются на функцию –

+0

^^ ИЛИ, если возможно, я думаю, что еще лучше было бы передать его как аргумент (Then у вас также есть несколько дополнительных опций, чтобы сделать его необязательным и значением по умолчанию) – Rizier123

+0

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

ответ

2

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

function myFunctionCreator() { 
    $a = 1; // Must exist for the `use` clause 
    $func = function() use($a){ 
     echo $a, PHP_EOL; 
    }; 
    return $func; 
} 

$myFunc = myFunctionCreator(); 
$a = 2; 

$myFunc(); // echoes 1 (value of $a at the point where the function was created) 

Как видно из приведенного выше примера, $a имеет значение 1 в точке, где определена функция, и даже если переменная с тем же именем существует в точке, когда функция вызывается, то является оригиналом $a (со значением 1), который используется в вызове функции.


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

function myFunctionCreator() { 
    $a = 1; // Need not exist, and will be ignored 
    $func = function($a) { 
     echo $a, PHP_EOL; 
    }; 
    return $func; 
} 

$myFunc = myFunctionCreator(); 
$value = 2; 

$myFunc($value); // echoes 2 (value of $a explicitly passed to the function call 
        //   at the time it is executed) 

Так поведение двух типов совершенно различны, и их назначение в сочетании обеспечивает определенную степень гибкости, которая довольно сильно отличается


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

function myFunctionCreator() { 
    $func = function(array $dataset = [1,2,3]) { 
     foreach($dataset as $value) { 
      echo $value, PHP_EOL; 
     } 
    }; 
    return $func; 
} 

$myFunc = myFunctionCreator(); 
$value = ['a','b','c']; 

$myFunc($value); 
$myFunc(); 
$myFunc(['x','y','z']); 

Или (как показывает третий вызов, аргументы могут быть переданы непосредственно.

Энди из них применяется к «использовать» аргумент приведет к ошибке синтаксического анализа

+0

^Очень красивые примеры :) Точно то, о чем я думал. Может быть, стоит также упомянуть, что с обычным аргументом вы можете сделать его необязательным, чтобы определить значение по умолчанию, которое вы не можете использовать с 'use()' например. 'function xy ($ x = 4) {}'; 'use ($ x = 4)' <- использование не будет работать – Rizier123