isset () и глобальная переменная PHP - PullRequest
8 голосов
/ 03 апреля 2010

У меня вопрос по поводу инициализации глобальной переменной.

function hello_testing() {
  global $conditional_random;
  if (isset($conditional_random)) {
      echo "foo is inside";  
  }
}

Глобальная переменная (conditional_random) не может быть инициализирована до вызова функции hello_testing().

Итак, что происходит с моей проверкой через isset(), когда $conditional_random не инициализируется? Это потерпит неудачу или это всегда будет правдой?

Ответы [ 3 ]

13 голосов
/ 03 апреля 2010

Ну, почему бы тебе просто не проверить? ; -)

Примечание: Не так просто, как вы думаете - прочитайте полный ответ; -)


Вызов функции hello_testing(); без установки переменной:

hello_testing();

Я не получаю вывод - что указывает isset возвращено false.


Вызов функции после установки переменной:

$conditional_random = 'blah';
hello_testing();

Я получаю вывод:

foo is inside

Что указывает на то, что global работает, как и ожидалось, когда переменная установлена ​​ - ну, в этом не должно быть никаких сомнений ^^



НО обратите внимание, что isset вернет false, если переменная установлена, и null!
См. справочную страницу isset()

Что означает, что лучшим тестом будет:

function hello_testing() {
  global $conditional_random;
  var_dump($conditional_random);
}

hello_testing();

И это показывает:

null

No Notice: переменная существует! Даже если null.

Поскольку я не устанавливал переменную вне функции, это показывает, что global устанавливает переменную - но она не помещает значение в нее; это означает, что null, если он еще не установлен вне функции.


Пока:

function hello_testing() {
  //global $conditional_random;
  var_dump($conditional_random);
}

hello_testing();

Дает:

Notice: Undefined variable: conditional_random

Доказывает, что уведомления включены; -)

И, если бы global не " установил " переменную, предыдущий пример дал бы то же самое уведомление.


И, наконец:

function hello_testing() {
  global $conditional_random;
  var_dump($conditional_random);
}

$conditional_random = 'glop';
hello_testing();

Дает:

string 'glop' (length=4)

(Чисто для демонстрации моего примера не обманули ^^)

8 голосов
/ 19 марта 2015

Вы можете проверить, был ли создан глобал, проверив, существует ли ключ в $ GLOBALS:

echo array_key_exists('fooBar', $GLOBALS)?"true\n":"false\n";
//Outputs false

global $fooBar;

echo array_key_exists('fooBar', $GLOBALS)?"true\n":"false\n";
//Outputs true

echo isset($fooBar)?"true\n":"false\n";
//Outputs false

Это единственный известный мне способ проверить существование глобального без предупреждения.

Как уже упоминал Манос Дилаверакис, вам следует избегать использования глобалов по возможности.

0 голосов
/ 03 апреля 2010

Global устанавливает переменную.Поэтому isset($some_globald_variable) всегда будет возвращать true.

Лучшим вариантом будет empty()

 if(empty($globald_variable))
 {
 // variable not set
 } 
...