在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;
}
答案 0 :(得分:2)
您未在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';
您将收到错误消息&#39;&#34; MyClass&#34;已被定义&#39;当它试图加载第二个包含。
<小时/> 这样做时:
include_once 'MyClass.php';
include_once 'MyClass.php';
PHP将跳过加载第二个包含,并且您不会收到错误,说明该类已被定义。
因此,对于B.php
,最好选择require_once
或include_once
,这样您就不会重新定义功能并收到错误。
您还应注意include*
和require*
之间存在差异。
使用include*
时如果无法加载文件,脚本将继续运行,具体取决于您所做的操作可能会损坏数据/结果。
使用require*
时如果无法加载文件,脚本将结束执行。