Как функция unset() ведет себя по-разному в зависимости от способа доступа к глобальной переменной внутри функции?

Насколько мне известно, любая переменная, объявленная вне функции, рассматривается в PHP как «глобальная переменная».

Чтобы получить доступ к такой глобальной переменной внутри функции, есть два способа: объявить ее как глобальную внутри функции с помощью ключевого слова «global». Другой способ - получить доступ к глобальной переменной как к индексу суперглобальной переменной как $GLOBALS['global variable'].

Оба вышеупомянутых способа делают одно и то же, и оба действительны.

Но в следующих двух программах это предположение кажется ошибочным, поскольку обе программы генерируют разные выходные данные. Я хочу развеять это сомнение, верно ли это предположение на 100% или оно иногда работает, а иногда нет.

Пожалуйста, просмотрите следующие фрагменты кода и их соответствующие результаты:

Фрагмент кода 1:

<?php

  function destroy_foo() {
    global $foo;
    unset($foo);
  }

  $foo = 'bar';
  destroy_foo();
  echo $foo;
?>

Вывод фрагмента кода 1:

bar

Фрагмент кода 2:

<?php

  function destroy_foo() {
    unset($GLOBALS['foo']);
  }

  $foo = 'bar';
  destroy_foo();
  echo $foo;
?>

Вывод фрагмента кода 2:

Примечание: неопределенная переменная: foo в hello.php в строке 9


person PHPFan    schedule 15.09.2017    source источник
comment
Объяснение идет здесь в первом примере unset()   -  person Sahil Gulati    schedule 15.09.2017
comment
@SahilGulati: Что бы вы ни хотели сказать, пожалуйста, говорите это четко и точно. Не будьте расплывчатыми, это создает путаницу, только это.   -  person PHPFan    schedule 15.09.2017
comment
Это отличный вопрос, хорошая работа по минимизации примера. Однако я хотел бы упомянуть, что глобальных переменных следует избегать, и есть очень мало случаев, когда их действительно следует использовать. Они, как правило, затрудняют расшифровку поведения кода, поскольку оно будет меняться в зависимости от общего состояния приложения, а не, например, от состояния локального объекта.   -  person John V.    schedule 15.09.2017


Ответы (1)


Ключевое слово global просто импортирует переменную в функцию, а $GLOBALS — массив PHP superglobal.

Ассоциативный массив, содержащий ссылки на все переменные, которые в настоящее время определены в глобальной области действия скрипта. Имена переменных являются ключами массива.

Думайте о ключевом слове global как о clone/copy той же самой переменной, а $GLOBALS — это фактическое хранилище, в котором находятся глобальные переменные, и вы можете добавлять или удалять из хранилища, когда захотите.

Поэтому всякий раз, когда clone/copy переменной не установлено, она больше не будет существовать в этой области. бывший

<?php
function destroy_foo() 
{
    global $foo;
    unset($foo);
    echo $foo;-- Undefined variable: foo
}

$foo = 'bar';
destroy_foo();
?>

Надеюсь, поможет.

person Basheer Kharoti    schedule 15.09.2017
comment
Разница между локальным скопированным глобальным и тем фактом, что $GLOBALS является глобальным с прямым доступом, действительно является ответом. Однако этот ответ можно улучшить, объяснив, как эта разница меняет поведение неустановленной функции. - person John V.; 15.09.2017
comment
Теперь все в порядке, @JohnV. ? - person Basheer Kharoti; 15.09.2017