php - как правильно включить конфиг?

В A.php я включаю config.php и B.php:

include_once("path/to/config.php");
include_once("path/to/B.php");

B.php — это общий скрипт, используемый другими скриптами. Я не знаю, включал ли сценарий, который включал B.php, также config.php, поэтому в B.php есть

include_once("path/to/config.php");

Проблема в том, что в A.php я могу прочитать все переменные из config.php, а в B.php они не заданы. Если я сделаю print_r(get_included_files()) в B.php, я увижу, что config.php включено.

Чем это вызвано? Как я могу правильно включить этот config.php, чтобы он был доступен в B.php (и других сценариях, включенных A.php...)?

РЕДАКТИРОВАТЬ: добавлено содержимое скриптов.

config.php:

<?php

$db_ip = "";
$db_login="";
$db_pass ="";
$db_port = 30050;
$db_name_hlstats = "";
$db_name_csgo = "";
$db_name_report = "";

$db_web_host = "";
$db_web_port = "3306";
$db_web_login = "";
$db_web_pass = "";
$db_web_name = ""; 

B.php:

<?php

    function GetServers()
    {
        include_once("/data/web/virtuals/93680/virtual/config/config.php");
        include_once("/data/web/virtuals/93680/virtual/scripts/getPDO.php");
        include_once("/data/web/virtuals/93680/virtual/scripts/PDOQuery.php");

        print_r(get_included_files()); // shows config.php in included files
        echo "servers.php | $db_ip:$db_port"; // variables show nothing

        $pdo = getPDOConnection($db_ip, $db_login, $db_pass, $db_name_csgo, $db_port);

        $query = "SELECT ...";
        $result = getPDOQueryResult($pdo, $query, __FILE__, __LINE__);
        $res = array();

        foreach ($result as $row)
        {
          $res[$row["server_id"]] = $row;
        }

        return $res;
    }

person jirinovo    schedule 28.10.2015    source источник
comment
Как выглядят config.php и B.php?   -  person Get Off My Lawn    schedule 28.10.2015
comment
ваши пути являются относительными, а не абсолютными, поэтому вы фактически не включаете конфигурацию в B, вы включаете path/to/path/to/config.php, который не является файлом.   -  person cmorrissey    schedule 28.10.2015
comment
@GetOffMyLawn: config.php - переменные (имя хоста БД и т.д.). B.php - одна функция.   -  person jirinovo    schedule 28.10.2015
comment
Не могли бы вы добавить их в свой ответ? Это может быть способ, которым вы их создаете и/или получаете к ним доступ.   -  person Get Off My Lawn    schedule 28.10.2015
comment
@cmorrissey: я всегда включаю абсолютный путь (от корня сервера). В этом случае /data/web/virtuals/93680/virtual/config/config.php   -  person jirinovo    schedule 28.10.2015
comment
@jirinovo Я не имел в виду добавить ваш комментарий к вопросу, я имел в виду добавить содержимое файлов к вопросу, чтобы мы могли видеть фактический код.   -  person Get Off My Lawn    schedule 28.10.2015
comment
@GetOffMyLawn: О да. Надеюсь, поможет :)   -  person jirinovo    schedule 28.10.2015


Ответы (1)


причина, по которой вы не получаете результатов в B.php, заключается в том, что вы используете include_once, который будет включать файл только в том случае, если он еще не был включен. В вашем случае вы включаете его в A.php, чтобы он увидел, что он уже был загружен, и не будет загружать его снова в течение B.php (он же пропустит включение).

Если вместо этого вы используете include в своей функции B.php, вы должны увидеть свои результаты.

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

Примеры


class MyClass{

    // Contains some methods    

}

При включении файла, делающего это:

include 'MyClass.php';
include 'MyClass.php';

Вы получите сообщение об ошибке «MyClass уже определен», когда он попытается загрузить второе включение.


При этом:

include_once 'MyClass.php';
include_once 'MyClass.php';

PHP пропустит загрузку второго включения, и вы не получите сообщение об ошибке, говорящее о том, что класс уже определен.

Так что для вас B.php было бы неплохо сделать require_once или include_once, чтобы не переопределить свою функцию и не получить ошибку.

Вы также должны отметить, что между include* и require* есть различия.

При использовании include*, если файл не может быть загружен, сценарий будет продолжать работать и, в зависимости от того, что вы делаете, может повредить данные/результаты.

При использовании require*, если файл не может быть загружен, скрипт завершит выполнение.

person Get Off My Lawn    schedule 28.10.2015
comment
Спасибо! :) Итак, могу я спросить вас, где использовать include_once? - person jirinovo; 28.10.2015