php - 如何正确包含配置?

时间:2015-10-28 18:11:36

标签: php include php-include

A.php我包括config.phpB.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;
    }

1 个答案:

答案 0 :(得分:2)

您未在B.php中获得结果的原因是因为您使用的include_once仅包含该文件(如果尚未包含该文件)。在您的情况下,您将其包含在A.php中,以便它看到它已经加载,并且不会在B.php内再次加载它(也就是说它会跳过包含)。

如果您在include功能中使用B.php,则会看到结果。

require_onceinclude_once通常最适用于包含类/方法/函数的库,因此您不会不小心尝试多次定义它们。

实施例

class MyClass{

    // Contains some methods    

}

包含执行此操作的文件时:

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

您将收到错误消息&#39;&#34; MyClass&#34;已被定义&#39;当它试图加载第二个包含。

<小时/> 这样做时:

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

PHP将跳过加载第二个包含,并且您不会收到错误,说明该类已被定义。

因此,对于B.php,最好选择require_onceinclude_once,这样您就不会重新定义功能并收到错误。

您还应注意include*require*之间存在差异。

使用include*时如果无法加载文件,脚本将继续运行,具体取决于您所做的操作可能会损坏数据/结果。

使用require*时如果无法加载文件,脚本将结束执行。