PHP: эмулировать глобальное поведение неизвестной переменной внутри функции - PullRequest
0 голосов
/ 29 января 2012

Чтобы включить необработанные файлы JavaScript на мои страницы, я использовал:

function include_js($jsfile, $basepath = JSPATH){
    echo '<script type="text/javascript">';
    include($basepath . $jsfile);
    echo '</script>';
}

Работает нормально, и код PHP внутри этих файлов JS по-прежнему работает нормально, здесь нет проблем. Но вот некоторый псевдокод того, что я использовал раньше:

<script>
    var hello = '<?php echo $id; ?>';
</script>

Итак, вот в чем проблема:

  • Раньше код PHP, используемый внутри моих файлов JavaScript, выполнялся в том же контексте, что и страница.
  • Теперь он выполняется в контексте функции include_js().

Таким образом, у меня больше нет доступа ни к одной из переменных моей страницы. Я мог бы исправить это с помощью global $id;, но это был псевдокод.

На самом деле, я понятия не имею, к каким переменным мне нужно иметь доступ.

Есть идеи, как решить эту проблему? Если у вас есть лучшее решение, чем то, что я на самом деле делаю внутри include_js(), для достижения той же цели без проблем, о которых я говорю, это было бы очень важно!

Ответы [ 2 ]

1 голос
/ 29 января 2012

Вы можете импортировать все глобальные переменные (кроме Superglobals ) в локальную область функции, в которую вы выполняете включение.Я не думаю, что это действительно хорошее решение (так как это молоток), но когда вы пишете свой вопрос, вы не знаете, какие переменные используются, поэтому вы можете локализовать их следующим образом:

$varname = $GLOBALS['varname'];

КакВ качестве альтернативы вы можете проверить файл JS и / или предоставить список переменных для файла и добавить его в функцию включения в виде массива.См. другой ответ для примера кода.

Вы также можете сначала предварительно включить (и выбросить) файл js, собрать предупреждения о неопределенных переменных, импортировать их, а затем включить для реального,Некоторые больше включают / отбрасывать / возвращать / связанные с переменной куски кода .

1 голос
/ 29 января 2012

Вы можете использовать глобальные переменные, но более надежный способ - написать свои собственные "постоянные базы данных". Что-то вроде:

class ConstantDB{
    public static function set($key, $value){
    }

    public static function get($key){
    }
}

Это просто очень удобно во многих случаях. Для вашей конкретной ситуации вы можете использовать

ConstantDB::set("my_id", $id);

и внутри include_js вы можете использовать

ConstantDB::get("my_id");
...