/webroot/core.php
<?php
require_once "config.php";
//register autoloads
//do some initialization... standard stuff
?>
/webroot/config.php
<?php
define("WEB_ROOT","/webroot");
define("DB_USER","root");
// ... more stuff...
?>
/webroot/admin/index.php
<?php
require_once("../dbconnect.php");
echo WEB_ROOT;
// print string literal WEB_ROOT rather than value in config.php
?>
我的理解是文件操作是相对于发出请求的文件的目录,不应该require_once(“config.php”)选择相对于core.php的文件?这个代码就像我在mac或Linux上所期望的那样工作,但在Windows上却没有,(如果我改变了要求使用完整路径或../,它可以工作)
真正的疯狂是require_once(“config.php”)不会抛出任何错误,但内部代码都没有执行!
答案 0 :(得分:7)
如果PHP默默地忽略错误,请尝试放在所请求文件的顶部:
ini_set('display_errors', 'On');
error_reporting(E_ALL);
现在所有错误都应该可见。
然后,最佳实践(根据我)是在请求的文件中(不在任何包含的文件中)使用应用程序根的完整文件系统路径定义一些常量。因此,如果应用程序根目录为index.php
,则/webroot/admin
:
define('APP_DIR', dirname(__FILE__));
在您包含某些内容之后,请使用此常量。如果目录结构是:
/webroot/
admin/
index.php
config.php
core.php
您希望将config.php
加入index.php
:
require_once APP_DIR . '/../config.php';
在core.php
中加入config.php
,它将是:
require_once APP_DIR . '/../config.php';
等等。
使用绝对文件系统路径可以防止出现任何歧义。
答案 1 :(得分:2)
如果要使用相对于包含文件的路径来包含文件,则必须在前面添加完整路径,如下所示:
<?php
require_once(dirname(__FILE__) . "/config.php");
?>
答案 2 :(得分:1)
也许您正在遇到PHP的open_basedir限制?为了防止某些恶意脚本,PHP具有“安全模式”,除其他外,它限制了可以从中加载文件的位置。如果xampp默认启用此功能,则可能会遇到此问题。
您可能还想查看您的网络服务器的错误日志,看看是否有任何失败的迹象(并打开错误报告,最好是E_ALL,直到您将问题排序)。