Путаница с идентификатором «use» при закрытии PHP

Я немного запутался с закрытием PHP. Может кто-то прояснить это для меня:

// Sample PHP closure my_method(function($apples) use ($oranges) { // Do something here }); 

В чем разница между $apples и $oranges и когда я должен использовать их?

$apples возьмет значение, которое передается функции, когда оно вызывается, например

 function my_method($callback) { // inside the callback, $apples will have the value "foo" $callback('foo'); } 

$oranges будут ссылаться на значение переменной $oranges которая существует в области, где вы определили закрытие. Например:

 $oranges = 'bar'; my_method(function($apples) use ($oranges) { // $oranges will be "bar" // $apples will be "foo" (assuming the previous example) }); 

Различия заключаются в том, что $oranges связаны при определении функции и $apples привязаны при вызове функции.


Закрытие позволяет вам обращаться к переменным, определенным вне функции, но вы должны явно указать PHP, какие переменные должны быть доступны. Это похоже (но не эквивалентно!) На использование ключевого слова global если переменная определена в глобальной области:

 $oranges = 'bar'; my_method(function($apples) { global $oranges; // $oranges will be "bar" // $apples will be "foo" (assuming the previous example) }); 

Различия между использованием закрытий и global :

  • Вы можете привязать локальные переменные к закрытию, global работают только с глобальными переменными.
  • Закрытие связывает значение переменной во время определения закрытия. Изменения в переменных после определения функции не влияют на нее.
    С другой стороны, если вы используете global , вы получите значение, которое имеет переменная в момент вызова функции.

    Пример:

     $foo = 'bar'; $closure = function() use ($foo) { echo $foo; }; $global = function() { global $foo; echo $foo; }; $foo = 42; $closure(); // echos "bar" $global(); // echos 42 

$apples передается как аргумент my_method , а $oranges вводятся внутри.