iNickolay
@iNickolay

Как присходит инизиализация переменной?

Здравствуйте!
Сложилась интересная ситуация, имеем что-то вроде небольшого шаблонизатора.
Приведу небольшую вырезку из кода:
class Decor
{
  public function draw()
  {
    ob_start();
    $this->loadThemePart('name');
    $buffer = ob_get_contents();
    ob_end_clean();
    ...
    return $buffer;
  }

  public function loadThemePart($template_name)
  {
    if(!isset($some_var)) { $some_var = 'test variable'; }
    $expansionFile = '/some/path/to/file.php';
    include_once $expansionFile;
    include_once $template_name;
  }
}

И теперь, если написать вот этот пример в $expansionFile:
var_dump($some_var);

function old() {
    global $some_var;
    var_dump($some_var);
}

то в первом случае выведет test variable, а во втором - NULL
Никак не пойму, почему так происходит?
  • Вопрос задан
  • 118 просмотров
Решения вопроса 1
hack504
@hack504
Переменные в классах изолированны от глобальных переменных, но так как ты инклудишь файл $expansionFile внутри класса, то ему доступны и изолированные переменные данного класса, чего не скажешь о функции - она смотрит в глобальные переменные. Сама функция внутри метода класса глобальна и не может оперировать переменными класса
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Minifets
@Minifets
Hello world!!!
Сложилась интересная ситуация

Ничего интересного, просто нужно понимать как работает область видимости.

Внутри метода loadThemePart вы объявляете новую переменную $some_var, ее область видимости ограниченна этим методом, т.е. вне этого метода к ней нельзя получить доступ.
Затем вы подключаете новый php файл. Т.к. он подключен в области видимости метода loadThemePart, то он имеет доступ к локальной переменной $some_var.
В функции old вы пытаетесь получить доступ к глобальной переменной $some_var, но она у вас не объявленна нигде в коде, есть только локальная $some_var. Соответственно глобальная $some_var имеет пустое значение.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы