2010-04-03 2 views
5

У меня вопрос о инициализации глобальных переменных.isset() и глобальная переменная PHP

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

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

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

+0

На боковой ноте старайтесь держаться подальше от глобальной. Это верный признак кода спагетти. –

+1

@Manos Я согласен, но если вы развиваетесь в сообществе Wordpress (в качестве примера), то более или менее невозможно избегать глобальных переменных или ряда других плохих соглашений. На мой взгляд, если вы в первую очередь работаете с PHP, вы смирились с тем, чтобы терпеть неудачные методы кодирования и просто должны знать относительно безопасные способы работы с тем, что у вас есть. –

ответ

9

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

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


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

hello_testing(); 

У меня нет выхода - что указывает issetfalse.


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

$conditional_random = 'blah'; 
hello_testing(); 

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

foo is inside 

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



НО обратите внимание, что isset вернется false если переменная установлена, и null!
Посмотреть manual page of isset()

Это означает, что лучше тест будет:

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

hello_testing(); 

и это отображается:

null 

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

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


Хотя:

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

hello_testing(); 

Дает:

Notice: Undefined variable: conditional_random 

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

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


И, наконец:

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

$conditional_random = 'glop'; 
hello_testing(); 

Дает:

string 'glop' (length=4) 

(Сугубо, чтобы продемонстрировать мой пример не обманут ^^)

+1

Итак, ваш «тест» - это увидеть, вызвано ли уведомление? Хотя объяснение того, как работает isset, является хорошим, это, похоже, не дает полезной альтернативы. – Omn

-1

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

Лучшим вариантом является empty()

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

не хотят звучать как задница :), но вы забыли одну скобку в своем выражении 'if' :) – Gabriel

+5

Переменная создается, но инициализируется как нуль. isset возвращает false, если задана переменная с нулевым значением. – goat

+0

@goat прав, этот ответ неверный –

6

Вы можете проверить, если глобальный был создан путем проверки наличия ключа в $ 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 

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

Как упоминалось в «Manos Dilaverakis», вы должны избегать использования глобалов, когда это возможно.

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