Проблема с использованием require внутри функции и области видимости переменной - PullRequest
0 голосов
/ 22 сентября 2009

Я использую настройку MVC и пытаюсь внедрить javascript в свои представления (.php), но разрешаю доступ к javascript ко всем переменным, к которым имеет доступ представление. Моя конечная цель - получить доступ к переменным PHP из моего javascript (например, чтобы я мог alert() название продукта).

Вот мой поток заявок:

  1. запуск буфера вывода
  2. call extract () для связанного массива (содержит данные для моего просмотра)
  3. вызов на просмотр файла
  4. вернуть содержимое буфера вывода и очистить буфер
  5. эхо-буфер

У меня есть функция injectJS(), которая выглядит следующим образом:

function injectJS($jsFile) {
 require APP_DIR . $jsFile;
}

Вот пример Javascript (alert.js), который я хочу добавить:

 <script type="text/javascript">
     alert("product name: <?php echo $product['name']; ?>");
 </script>

Итак, в моем файле просмотра я звоню injectJS('alert.js');. Он внедряет javascript, но я получаю уведомление PHP о наличии неопределенной переменной $product при рендеринге представления. Однако, если я пишу оператор require от руки, все работает нормально. Возможно ли достичь чего-либо с помощью injectJS()?

Редактировать
Я забыл упомянуть, что я пытался явно передать переменные в injectJS(), и это работает, но я не хочу всегда передавать переменные. Это может стать грязным и громоздким, если представление должно передавать много переменных в JS. Есть ли способ, которым я мог бы (внутри функции) захватить переменные в рамках скрипта, ответственного за вызов injectJS()?

Редактировать 2
Если подумать, передача переменных снова не реальная проблема, я думаю, что я просто жадный / ленивый;). Я просто передам переменные при необходимости injectJS(). Спасибо за ответы

Ответы [ 3 ]

2 голосов
/ 22 сентября 2009

В PHP переменные не видны внутри функций, если они не переданы в качестве параметров или не объявлены как global.

Похоже, проблема в том, что переменная $ product не существует внутри функции injectJS; если это глобальная переменная, созданная вне этой функции, вы должны либо передать ее как параметр, либо объявить ее как глобальную в начале функции:

function injectJS($jsFile) {
    global $product;
    require APP_DIR . $jsFile;
}

Для получения дополнительной информации вы можете взглянуть на раздел Область действия переменной в руководстве и, более конкретно, подраздел о Глобальное ключевое слово

2 голосов
/ 22 сентября 2009

Передайте $ product вашей функции, и она будет видна внутри тела функции, или определите ее внутри:

function globalJs( $filename, $product ) {
    include $filename;
}

globalJs( 'foo.js', array( 'name' => 'test' ) );
1 голос
/ 22 сентября 2009

Это будет работать нормально, но ваша проблема в области видимости связана с тем, что в вашей функции нет переменной. Попробуйте это:

function injectJS($jsFile) {
    $product = array('name' => 'test');
    require APP_DIR . $jsFile;
}

В какой-то момент вы должны определить переменную в области видимости вашей функции. Ключевое слово PHP global позволит вам сделать это, если переменная существует глобально. Однако старайтесь избегать использования глобальных переменных, поскольку это приводит к проблемам в будущем.

...