2016-02-12 3 views
0

Я знаю, что это что-то глупое, но я не могу понять это. Я нашел несколько подобных questions все в контексте структуры MVC. Это тоже мое дело, поскольку я использую CodeIgniter.Область переменной: require_once не загружает мою переменную, но требует

У меня есть файл questions.php (который включен в представлении):

require_once '../site_init.php'; 

var_dump($siteVars); 
// shows null and a Notice: Undefined variable: siteVars 
// but the ABSPATH constant is showing as defined! 
var_dump(ABSPATH); 
// shows string 'c:\wamp\www\sitename' 

require '../site_init.php'; 
var_dump($siteVars); 
// correctly dumps the content of siteVars array 

и файл site_init.php, который должен быть включен везде, как он держит свои веб-узле значения конфигурации:

if (!defined('ABSPATH')) 
     define('ABSPATH', dirname(__FILE__) . '/'); 

/** Site-wide sitevars */ 
$siteVars = array(); 

// set to true in develop environment 
$siteVars['debug'] == false; 

Я знаю, что The require_once statement is identical to require except PHP will check if the file has already been included, and if so, not include (require) it again, однако, когда я использую require_once, я получаю уведомление, говорящее Undefined variable: siteVars, используя require, все работает так, как ожидалось. Однако, как вы можете видеть в приведенном выше коде, константа отображается как определено, хотя оба они определены в одном файле. PHP manual: Like superglobals, the scope of a constant is global. You can access constants anywhere in your script without regard to scope.

print_r(get_included_files()); показывает, что site_init.php был включен до require_once, поэтому мне не нужно требовать (_once) его снова.

Он должен иметь какое-то отношение к переменной области. Если я использую global $siteVars, он работает, без необходимости снова require, но может кто-то объяснить, почему это происходит? Я новичок в CodeIgniter. Я вижу, что есть только одна точка входа (основной файл index.php), и это базовый файл ($_SERVER['PHP_SELF']).

В идеале, я также хотел бы знать, как я могу исправить это, не используя global или require.

UPDATE: структура файла, как представляется, следующим образом (это проект я только работаю, я не оригинальный разработчик):

  • контроллер welcome.php нагрузки (include_once) файл X вне структуры папок приложения CodeIgniter (приложение CI является административной частью более крупного сайта).

  • файл X include_once site_init.php файл

  • контроллер welcome.php загружает вид $this->load->view('template', $data);

  • это довольно много его. Надеюсь, что это ключ к решению.

+0

http://stackoverflow.com/a/2418514/3599549. Была ли эта страница уже включена ранее? – Krii

+0

странно, я тестировал здесь 2 файла, используя require и require_once, оба раза преуспели. Я смог распечатать содержимое переменной. –

+0

Какая у вас версия php? Я чувствую, что кодогенератор не имеет к этому никакого отношения. Похоже, что проблема с пространством имен, но это странно сказать так .... –

ответ

1

В CodeIgniter из контроллера передаются только переменные, доступные в представлении. Там никогда не должно быть причиной, чтобы включить что-нибудь в этом случае в CodeIgniter

Контроллер:

$d['title'] = 'title';  
$this->load->view('main',$d); 

Вид:

<?php print $title;?> 

см Config класса http://www.codeigniter.com/user_guide/libraries/config.html для пользовательских значений конфигурации, которые затем могли быть доступны в контроллер и перешел на вид

+0

Спасибо, Мэтт, я думаю, что ваш ответ является ключом к решению. Я обновлю, если мне удастся это сделать. – bg17aw

+0

Привет, Мэтт, я обновил вопрос с дополнительной информацией, вы можете взглянуть, может быть, это поможет вам быть более уверенными в том, что проблема? – bg17aw

+0

@ bg17aw I Итак, у вас есть доступ к переменным в контроллере welcome.php, но не в представлении? –

0

Это логическая проблема, область просто помогает вам ее увидеть. Вот ключ к нему:

print_r(get_included_files()); показывает site_init.php был включен перед require_once, так что я не должен требовать (_once) снова.

Это говорит о том, что вы уже включили этот файл раньше, поэтому require_once() ничего не делает, когда вы снова пытаетесь. Дело не в том, что require_once() «не загружает вашу переменную», он просто делает то, что должен - избегать включения файла, который вы уже загрузили.
Очевидно, что require() не заботится об этом состоянии и повторно включает скрипт и, следовательно, импортирует указанную переменную в текущую область.

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

+0

вы только переформулируете мои собственные утверждения, я уже знаю, что я полностью знаю, что файл включен, а require_once ничего не делает. Тем не менее, я не думаю, что в том числе сайт-файл инициализации - плохая идея, на этот раз в файле инициализации есть переключатель 'debug', корневой путь и тому подобное. Как файл wp-config.php в WordPress. – bg17aw

+0

Разве вы не спрашивали * почему * он ничего не делает? Вот что я объяснил. – Narf

+0

Мне может быть что-то не хватает, я не вижу, как вы ответили на вопрос. Если вы читаете ответы на аналогичные вопросы, с которыми я связан, есть хороший момент в правильном направлении, поскольку это все связано с структурой структуры MVC. – bg17aw