php - 如何正确包含配置?
php - how to properly include config?
在 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
中它们没有设置。如果我在 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_once
和 include_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_once
或 include_once
是个好主意,这样你就不会重新定义你的函数并得到一个错误。
您还应注意 include*
和 require*
之间存在差异。
使用 include*
时,如果无法加载文件,脚本将继续 运行 并且根据您的操作可能会损坏 data/results.
使用require*
时,如果无法加载文件,脚本将结束执行。
在 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
中它们没有设置。如果我在 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_once
和 include_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_once
或 include_once
是个好主意,这样你就不会重新定义你的函数并得到一个错误。
您还应注意 include*
和 require*
之间存在差异。
使用 include*
时,如果无法加载文件,脚本将继续 运行 并且根据您的操作可能会损坏 data/results.
使用require*
时,如果无法加载文件,脚本将结束执行。