Возможный дубликат:
В Php 5.3.0 что такое функция «Использовать» идентификатор? Должен ли здравомыслящий программист использовать его?
Я изучал Closures в PHP, и это привлекло мое внимание:
public function getTotal($tax) { $total = 0.00; $callback = function ($quantity, $product) use ($tax, &$total) { $pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product)); $total += ($pricePerItem * $quantity) * ($tax + 1.0); }; array_walk($this->products, $callback); return round($total, 2); }
И кто-нибудь, пожалуйста, дайте мне объяснение об использовании use
в этом коде.
function ($quantity, $product) use ($tax, &$total)
Когда я ищу use
в PHP, он находит ключевое слово use
где он используется в пространствах имен, но здесь он выглядит иначе.
Благодарю.
В этом случае также верно использование «использования».
При закрытии для доступа к переменным, которые находятся вне контекста функции, вам необходимо явно предоставить разрешение функции с использованием функции использования. В этом случае это означает, что вы предоставляете функции доступ к переменным $ tax и $ total.
Вы заметили, что $ tax был передан как параметр функции getTotal, а $ total был установлен чуть выше строки, где определено замыкание.
Другое дело отметить, что $ tax передается как копия, в то время как $ total передается по ссылке (путем добавления & sign спереди). Передача по ссылке позволяет закрытию изменять значение переменной. Любые изменения стоимости $ tax в этом случае будут эффективны только при закрытии, а действительное значение $ total.
Когда вы объявляете анонимную функцию в PHP, вам нужно сказать, какие переменные из окружающих областей (если они есть) должны закрываться – они не закрываются автоматически ни в каких лексических переменных в области, которые упоминаются в теле функции. Список после use
– это просто список переменных для закрытия.
Это означает, что ваша внутренняя функция может использовать переменные $ tax и $ total от внешней функции, а не только ее параметры.