На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Ключевое слово use в PHP


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

Область видимости - это видимость переменной и метода, к которой имеет доступ определенная часть программы. Например, предположим, что мы объявляем переменную внутри функции (регулярную или замкнутую). Другие функции не будут иметь доступа к этой переменной. Эта переменная имеет локальную область действия для функции, в которой она была создана. Переменные могут иметь глобальную область действия и быть доступны в любом месте; эти переменные определяются вне функции.

Однако в PHP вызов переменной, имеющей глобальную область действия внутри функции, не сразу допустим, так как функция будет искать локальную переменную. Глобальные переменные должны быть объявлены как глобальные внутри функций, прежде чем их можно будет использовать.

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

Прежде чем мы рассмотрим пример, давайте рассмотрим анатомию закрытия с помощью ключевого слова use.

<?php

$global_variable = "Dino Cajic";

$closure = function() use($global_variable) {
    echo $global_variable;
};

?>
Ключевое слово use появляется сразу после объявления функции() и перед открывающей фигурной скобкой; вы передадите глобальную переменную внутри круглых скобок. Давайте перейдем к примеру.

<?php

$name = "Dino";

$hello = function() use($name) {
    echo $name;
};

echo $name; // Dino

$name = "Harrison";

echo $name; // Harrison
$hello();   // Dino

?>
  1. PHP присваивает значения Dino переменной $name.
  2. Создается замыкание $hello. Анонимная функция импортирует глобальную переменную $name во время определения функции. Как только функция будет вызвана, она будет повторять значение переменной $name.
  3. В строке 9 PHP печатает значение переменной $name. В настоящее время $name хранит строку Dino, поэтому Dino отображается на экране.
  4. Далее, в строке 11, переменной $name присваивается новое значение - Harrison.
  5. В строке 13 PHP печатаетзначение переменной $name. В настоящее время $name хранит строку Harrison, поэтому Harrison отображается на экране.
  6. Наконец, вызывается замыкание $hello().
  7. PHP возвращается к строке 5 и начинает выполнять содержимое, которое находится внутри тела закрытия. Вызывается оператор echo, и отображается Dino.
Мы изменили значение $name на Harrison в строке 11, так почему же отображается Dino? Помните, что я сказал ранее:

use получает значение глобальной переменной при определении функции, а global получит значение переменной при вызове функции

Когда PHP читал программу, он определил функцию в строке 5 и скопировал значение глобальной переменной, чтобы использовать ее. Позже, на 14-й линии, было объявлено о закрытии. Часть определения уже была выполнена, и значение было затвердевшим внутри закрытия. Вот почему вы получаете значение Dino вместо Harrison.

Вы, конечно, можете передать глобальную переменную в качестве аргумента, но если вам нужно использовать функцию use, именно так вы это и сделаете. Есть преимущества в том, чтобы делать и то, и другое, как было описано выше.

<?php

$global_variable = "Dino Cajic";

$closure = function($greeting) use($global_variable) {
    echo $greeting . " " . $global_variable;
};

$closure("Hello there");

?>
Давайте рассмотрим один последний пример, который включает ключевое слово use, глобальное ключевое слово и концепцию параметров.

<?php

$name1 = "Dino";
$name2 = "Harrison";

$closure = function($greeting) use($name1) {
    global $name2;
    
    echo $greeting . " " . $name1 . " and " . $name2 . "
"; }; $closure("Hello there"); $name1 = "Amy"; $name2 = "Steve"; $closure("Hi there"); ?>
  1. PHP начинает с присвоения значений Dino и Harrison переменным $name1 и $name2 соответственно.
  2. PHP определяет анонимную функцию. Анонимная функция объявляется с одним параметром - $greeting. Аргумент будет передан во время вызова функции. Анонимная функция использует ключевое слово use для копирования значения глобальной переменной $name1. Затем он использует ключевое слово global для доступа к значению глобальной переменной $name2. Наконец, он будет воспроизводить параметр $greeting и две глобальные переменные, $name1 и $name2.
  3. Замыкание вызывается в строке 12, и передается строка Hello there. PHP входит в закрытие и отображает: Привет, Дино и Харрисон.
  4. Код выходит из закрытия и продолжается в строке 14, изменяя значение $name1 с Dino на Amy.
  5. В строке 15 значение, хранящееся в $name2, изменяется с Harrison на Steve.
  6. Закрытие снова вызывается в строке 17. Строка Hi там передается в качестве аргумента.
  7. PHP входит в закрытие и отображает: Привет, Дино и Стив.
Несмотря на то, что обе глобальные переменные были изменены, только $name2 был обновлен в отношении анонимной функции, поскольку use получает значение глобальной переменной при определении функции, а global получает значение переменной при вызове функции.



Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.



тегизаметки, php, use

Читайте также:




Хорда окружности
Урок 5. Комментарии PHP


© upread.ru 2013-2021
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.