2013-09-04 2 views
14

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

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

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

+0

Возможная Дубликат (http://stackoverflow.com/questions/1065188/in- php-5-3-0-what-the-function-use-identifier) ​​ – Trix

ответ

16

$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, вы получите значение, которое имеет переменная в момент, когда функция называется.

    Пример: [? В PHP 5.3.0, что является функцией "использовать" идентификатор]

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

Как это отличается от использования 'global', потому что это первое, что приходило в голову. – enchance

+0

@enchance: поскольку 'use' может обращаться к переменным в локальной области. Когда вы используете '$ (апельсины)', '$ апельсины' не должны быть глобальными, как это происходит, когда вы делаете' global $ апельсины; '. –

+1

'global' ** не является ** эквивалентом' use', поскольку 'global' будет ссылаться на чистый глобальный контекст (также представленный' $ GLOBALS'), тогда как 'use' будет передавать только текущий локальный контекст. –

3

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

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