2009-05-19 4 views
0

Давайте предположим, что мы имеем следующую структуру:PHP include_once: обработка импорта т.е. файлов конфигурации

index.php 
config.inc.php 
\ lib 
\ lib \ common.php 

Несколько параметров, как имя базы данных, пользователь & со сконфигурированных в config.inc.php. Каков надлежащий способ доступа к ним, то есть от функции, расположенной в \lib\common.php. Должен ли я действительно делать include_once("config.inc.php") внутри каждой функции?

Это не похоже на работу, если:

  • config.inc.php включен один раз один раз в index.php, прежде чем включать \lib\common.php там
  • если config.inc.php определяет все переменные перед включая \lib\common.php и все остальные файлы (это я бы включил только config.inc.php во все «центральные» файлы на уровне index.php
  • не работает, если config.inc.php включен в начало \lib\common.php

Большое спасибо - я не смог найти решение с помощью Google!

Решение

Я включил config.inc.php раз в index.php (как это было предложено Галена) и использовать глобальные (как это было предложено Давида). Все работает так, как я ожидал, большое спасибо!

Позже я обязательно посмотрю auto_prepend, как предложено n3rd, tkx для этого!

ответ

3

Вы должны использовать global ключевое слово, чтобы получить доступ к переменным, которые были определены вне функции:

$var1 = "muh"; 
$var2 = "foo"; 

function test() { 
    global $var1; 
    echo "var1=$var1; var2=$var2\n"; 
} 

будет печатать "var1=muh; var2=".

2

Вы просто сделать:

include_once("..\\config.inc.php"); 

в верхней части common.php.

Теперь здесь есть несколько вещей - сначала обратные косые черты раздражают, и вы можете (даже на окнах, обменивать их на косые черты («../config.inc.php»). Если у вас есть каталог, где config.inc.php содержится внутри вашего пути include, вы можете просто сделать «config.inc.php».

Последнее и не менее важное, если данные в config.inc.php необходимы для common.php на работу, я предлагаю вам перейти к require_once() вместо этого, так как это вызовет вызов exit() или die() в случае, если файл не будет включен, следовательно, останавливая дальнейшее выполнение

EDIT:. а я не заметил, что другие S помощь. Чтобы использовать переменные, объявленные вне функции внутри функции, вам нужно сообщить функции, что ей нужно «вытащить» эти переменные внутри области функции, используя глобальное ключевое слово (как говорили другие).

Рассмотрим следующий пример:

$var = "Hello World"; 
function changeVar(){ 
    $var = "Bye World!"; 
    echo $var . "\n"; 
} 
changeVar(); 
echo $var; 

Выход выше указанного кода, НЕ:

Bye World! 
Bye World! 

а:

Bye World! 
Hello World 

Это связано с тем, что переменная $ var INSIDE функции - это ее собственная переменная, отличная от $ var, определяемой функцией OUTSIDE. Измените это:

$var = "Hello World"; 
function changeVar(){ 
    global $var; 

    $var = "Bye World!"; 
    echo $var . "\n"; 
} 
changeVar(); 
echo $var; 

И теперь у вас есть ожидаемый результат:

Bye World! 
Bye World! 
0

U использовать функцию auto_prepend, чтобы сделать именно это. Затем предварительно добавленный файл ищет иерархию каталогов из текущего сценария и ищет файлы, заканчивающиеся на «.autoinc.php», и включает их в обратном порядке, то есть те, что в подкаталогах могут перезаписывать материал, определенный в файлах, расположенных дальше по иерархии. Это устанавливается один раз и работает автоматически везде и совершенно ненавязчиво. Я считаю, что это довольно красивое и универсальное решение.

1

Если вы включили config.inc.php в файл index.php ... все файлы, которые будут включены после того, как они смогут использовать данные внутри него.

Если у вас есть функции в common.php вы должны будете использовать global ключевое слово, или передать данные в качестве аргументов для того, чтобы получить доступ к данным в config.inc.php

0

ИМХО это не хорошо практика определения переменных в конфигурационных целях. Вы можете переписать их внутри своего кода. Лучше определить константы. В качестве преимущества - они находятся в глобальном масштабе, и вы можете использовать их из любого места без «глобального» ключевого слова.

Я обычно использую абстрактный класс Config со статическими методами, который анализирует внешние данные (я использую конфигурационные файлы XML вне DOCUMENT_ROOT), а затем обеспечивает ее, с приведением к объектам, с кодом, как этот

$dbalias = Config::get('db'); 
DB::connect($dbalias); 
echo $dbalias->user . '@' . $dbalias->host; 

Это очень полезно, когда вы работаете с командой и используете средство управления версиями (например, SVN). Evereyone в вашей команде работает на localhost, фиксирует все, кроме локального файла конфигурации, который не управляется версиями.

Не уверен, что этот способ является лучшим, но безопасным и очень удобным для кодирования, чтения и поддержки.

Смежные вопросы