PHP include_once: обработка импорта, т.е. файлов конфигурации - PullRequest
0 голосов
/ 19 мая 2009

Предположим, у нас есть следующая структура:

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

Несколько параметров, таких как имя базы данных, user & co, сконфигурированы в 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!

Ответы [ 5 ]

3 голосов
/ 19 мая 2009

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

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

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

напечатает "var1=muh; var2=".

2 голосов
/ 19 мая 2009

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

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

наверху common.php.

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

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

РЕДАКТИРОВАТЬ: Ах, я не заметил, что говорили другие. Чтобы использовать переменные, которые объявлены вне функции внутри функции, вы должны сообщить функции, что ей нужно «вытащить» эти переменные внутри области действия функции, используя ключевое слово global (как уже говорили другие).

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

$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, определенной вне функции. Измените это на:

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

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

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

Bye World!
Bye World!
1 голос
/ 19 мая 2009

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

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

0 голосов
/ 19 мая 2009

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

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

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

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

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

0 голосов
/ 19 мая 2009

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

...