PHP, нечетная переменная область видимости? - PullRequest
5 голосов
/ 21 апреля 2011

Это больше вопрос о том, почему, а затем как, но это уже несколько дней меня раздражает.В настоящее время я немного работаю с CodeIgniter и временно возвращаюсь к PHP из Ruby, сообщая мне о следующей магической области видимости.

<?php $query = $this->db->get('articles', 2);
        if ($query->num_rows() > 0)
        {
           foreach ($query->result_array() as $row)
           {
              $data[] = $row; # <-- first appearance here
           }
        return $data; # <--- :S what?!
        } 

Как видите, я не совсем гуру PHP, но идеяиз локальной области видимости выдает мне сообщение о том, что вне цикла foreach переменная «доступна».Итак, я попробовал это в представлении:

<?php

    if($a==1)
    {
    $b = 2;
    }
    echo $b;
?>

, что приводит к сообщению об ошибке:

Message: Undefined variable: b

В руководстве по PHP рассказывается о локальной области видимости, но я все еще задаюсь вопросом, почему этобывает, и если есть особые правила, о которых я не знаю.И это пугает меня:)

Спасибо за обмен идеями,

Ответы [ 6 ]

11 голосов
/ 21 апреля 2011

Только функции создают новую локальную область.Фигурных скобок сами по себе нет.Фигурные скобки - это просто вспомогательная конструкция для других языковых структур (if, while или foreach).

И где бы вы ни обращались к любой переменной в локальной области видимости,иметь значение.Локальная область действия представляет собой скрытый словарь за кадром (см. get_defined_vars ).Вы можете получить уведомление об отладке, открыв ранее неопределенные переменные, но это все.

В вашем конкретном примере кажется, что вы просто работаете в глобальной области действия.

7 голосов
/ 21 апреля 2011

foreach не создает никакой области видимости переменных в PHP, поэтому естественно, что переменная доступна вне foreach

для второго вопроса $a не равно 1, следовательно, $b не инициализируется и выдает уведомление при доступе снаружи. Если вы присвоите значение 1 для $a и протестируете его, вы удивитесь, что уведомления исчезнут.

Здесь нет ничего похожего на сферу.

3 голосов
/ 21 апреля 2011

См .: http://php.net/manual/en/language.variables.scope.php

В фигурных скобках php необязательно указывать новую область видимости для переменных.(ваш первый пример)

Во втором примере $ b устанавливается только для определенного условия.Так что возможно быть «неопределенным», если это условие не выполняется.

1 голос
/ 21 апреля 2011

На самом деле ваш первый метод должен дать вам ошибку тоже.

Вы используете переменную, которая не была объявлена ​​как массив.Я не могу понять, почему вы не получили ошибку за это.

PHP не имеет области видимости блока, поэтому не имеет значения, находится ли он внутри IF или FOREACH.Если он доступен внутри метода, вы можете использовать его внутри метода.

1 голос
/ 21 апреля 2011

равно $ а равно 1?Если нет, то $ b = 2 никогда не будет оцениваться!

1 голос
/ 21 апреля 2011

Shyam, вы используете язык сценариев, а не C ++.Для языков сценариев, таких как PHP или JavaScript, характерно отсутствие разных областей действия для каждого блока кода.Вместо этого есть одна область для всей функции.Это на самом деле очень удобно, если вы рассматриваете свой первый пример, но вам, очевидно, нужно быть осторожным, как видно из второго.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...