Я знаю, что это что-то глупое, но я не могу понять это. Я нашел несколько подобных 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);
это довольно много его. Надеюсь, что это ключ к решению.
http://stackoverflow.com/a/2418514/3599549. Была ли эта страница уже включена ранее? – Krii
странно, я тестировал здесь 2 файла, используя require и require_once, оба раза преуспели. Я смог распечатать содержимое переменной. –
Какая у вас версия php? Я чувствую, что кодогенератор не имеет к этому никакого отношения. Похоже, что проблема с пространством имен, но это странно сказать так .... –