php - 如何正确包含配置?

php - how to properly include config?

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 中它们没有设置。如果我在 B.php 中执行 print_r(get_included_files()),我可以看到包含 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;
    }

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

如果您在 B.php 函数中使用 include,您应该会看到结果。

require_onceinclude_once 通常最好包含包含 classes/methods/functions 的库,这样您就不会不小心尝试多次定义它们。

例子


class MyClass{

    // Contains some methods    

}

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

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

当它尝试加载第二个包含时,您将收到一条错误消息,提示“"MyClass" 已定义”。


这样做时:

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

PHP 将跳过加载第二个 include,你不会收到一个错误提示 class 已经被定义。

所以对你来说 B.php 做一个 require_onceinclude_once 是个好主意,这样你就不会重新定义你的函数并得到一个错误。

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

使用 include* 时,如果无法加载文件,脚本将继续 运行 并且根据您的操作可能会损坏 data/results.

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